package eu.printingin3d.models.models;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import eu.printingin3d.javascad.basic.Radius;
import eu.printingin3d.javascad.coords.Angles3d;
import eu.printingin3d.javascad.coords.Coords3d;
import eu.printingin3d.javascad.coords.Dims3d;
import eu.printingin3d.javascad.enums.Side;
import eu.printingin3d.javascad.exceptions.IllegalValueException;
import eu.printingin3d.javascad.models.Abstract3dModel;
import eu.printingin3d.javascad.models.Cube;
import eu.printingin3d.javascad.models.Cylinder;
import eu.printingin3d.javascad.models.Extendable3dModel;
import eu.printingin3d.javascad.models.Sphere;
import eu.printingin3d.javascad.openscad.Consts;
import eu.printingin3d.javascad.tranzitions.Difference;
import eu.printingin3d.javascad.tranzitions.Union;
import eu.printingin3d.javascad.utils.SaveScadFiles;

public class Remembrall extends Extendable3dModel {
	private static final Radius INNER_SPHERE_RADIUS = Radius.fromRadius(25.0);
	private static final double THICKNESS = 1.5;
	private static final double WIDTH = 6.0;
	private static final double SHOULDER = 0.5;
	
	private static final double GAP = 1.0;
	
	private static final Radius PLOT_SPHERE_RADIUS = Radius.fromRadius(2.0);
	private static final double PLOT_DEEPNESS = 0.75;
	private static final int PLOT_NUMBER_IN_GROUP = 8;
	private static final int PLOT_GROUPS = 4;
	private static final double PLOT_ANGLE = 8.0;
	
	public Remembrall() {
		Radius bigRadius = INNER_SPHERE_RADIUS.plusRadius(THICKNESS);
		Radius smallRadius = bigRadius.plusRadius(-SHOULDER);
		Cylinder base = new Cylinder(WIDTH-SHOULDER*4, bigRadius);
		Abstract3dModel baseDisk = new Union(
				new Cylinder(WIDTH, smallRadius),
				new Cylinder(SHOULDER, bigRadius, smallRadius)
						.align(Side.TOP_OUT, base),
				new Cylinder(SHOULDER, smallRadius, bigRadius)
						.align(Side.BOTTOM_OUT, base),
				base
				);
		
		List<Abstract3dModel> removing = new ArrayList<>();
		removing.add(new Sphere(INNER_SPHERE_RADIUS));
		removing.add(new Cube(new Dims3d(GAP, THICKNESS*2.0, WIDTH*2.0))
								.move(Coords3d.yOnly(INNER_SPHERE_RADIUS.getRadius())));
		
		for (int t=0;t<PLOT_GROUPS;t++) {
			for (int i=0;i<PLOT_NUMBER_IN_GROUP;i++) {
				removing.add(new Sphere(PLOT_SPHERE_RADIUS)
							.move(Coords3d.yOnly(PLOT_SPHERE_RADIUS.getRadius()+bigRadius.getRadius()-PLOT_DEEPNESS))
							.rotate(Angles3d.zOnly(45-(PLOT_NUMBER_IN_GROUP-1)*PLOT_ANGLE/2+PLOT_ANGLE*i+(t*360/PLOT_GROUPS))));
			}
		}
		
		this.baseModel = new Difference(baseDisk, removing);
	}

	public static void main(String[] args) throws IllegalValueException, IOException {
		new SaveScadFiles(new File("C:/temp")).
				addModels("remembrall.print.scad", Arrays.asList(new Consts(0.2, 4), new Remembrall())).
				saveScadFiles();
	}
}
