var dom2D = DOMAIN([[0,1],[0,1]])([40,40]);

function surface(curves){
	return MAP(BEZIER(S1)(curves))(dom2D);
}

var blue_persia = [42/255, 82/255, 190/255];
var white = [1.5,1.5,1.5];
var gold = [218/255, 165/255, 32/255];



/****************************** BACK ******************************/

dx_back = 10;
dy_back_top = 1;
dy_back_low = 2;
dz_back = 12;


c1_fb = BEZIER(S0)([[0,0,0],[dx_back,0,0]]);
c2_fb = BEZIER(S0)([[0,0,dz_back/8],[dx_back,0,dz_back/8]]);
c3_fb = BEZIER(S0)([[0,0,dz_back/4],[dx_back,0,dz_back/4]]);
c4_fb = BEZIER(S0)([[0,0,3*dz_back/8],[dx_back,0,3*dz_back/8]]);
c5_fb = BEZIER(S0)([[0,3,2*dz_back/4],[dx_back,3,2*dz_back/4]]);
cf_fb = BEZIER(S0)([[0,0,dz_back],[dx_back,0,dz_back]]);

var front_side_back = COLOR(blue_persia)(surface([c1_fb,c2_fb,c3_fb,c4_fb,c5_fb,cf_fb]));


c1_tb = cf_fb;
c2_tb = BEZIER(S0)([[0,0-0.1,dz_back+0.2],[dx_back,0-0.1,dz_back+0.2]]);
c3_tb = BEZIER(S0)([[0,dy_back_top-0.1,dz_back+0.2],[dx_back,dy_back_top-0.1,dz_back+0.2]]);
cf_tb = BEZIER(S0)([[0,dy_back_top,dz_back],[dx_back,dy_back_top,dz_back]]);

var top_side_back = COLOR(blue_persia)(surface([c1_tb,c2_tb,c3_tb,cf_tb]));


c1_bb = cf_tb;
c2_bb = BEZIER(S0)([[0,dy_back_top+3,2*dz_back/4],[dx_back,dy_back_top+3,2*dz_back/4]]);
cf_bb = BEZIER(S0)([[0,dy_back_low,0],[dx_back,dy_back_low,0]]);

var back_side_back = COLOR(white)(surface([c1_bb, c2_bb, cf_bb]));


c1_lb = cf_bb;
c2_lb = BEZIER(S0)([[0,dy_back_low-0.1,-0.1],[dx_back,dy_back_low-0.1,-0.1]]);
c3_lb = BEZIER(S0)([[0,0,-0.1],[dx_back,0,-0.1]]);
cf_lb = c1_fb;

var low_side_back = COLOR(blue_persia)(surface([c1_lb,c2_lb,c3_lb,cf_lb]));


c1_leftb = BEZIER(S0)([[0,0,0],[0,0,dz_back/8],[0,0,dz_back/4],[0,0,3*dz_back/8],[0,3,2*dz_back/4],[0,0,dz_back]]);
c2_leftb = BEZIER(S0)([[-0.2,0,0],[-0.2,0,dz_back/8],[-0.2,0,dz_back/4],[-0.2,0,3*dz_back/8],[-0.2,3,2*dz_back/4],[-0.2,0,dz_back]]);
c3_leftb = BEZIER(S0)([[-0.2,dy_back_low,0],[-0.2,dy_back_top+3,2*dz_back/4],[-0.2,dy_back_top,dz_back]]);
cf_leftb = BEZIER(S0)([[0,dy_back_low,0],[0,dy_back_top+3,2*dz_back/4],[0,dy_back_top,dz_back]]);

var left_side_back = COLOR(white)(surface([c1_leftb,c2_leftb,c3_leftb,cf_leftb]));


c1_lteb = BEZIER(S0)([[0,0,dz_back],[0,0-0.1,dz_back+0.2],[0,dy_back_top-0.1,dz_back+0.2],[0,dy_back_top,dz_back]]);
c2_lteb = BEZIER(S0)([[0,0,dz_back],[-0.2,0-0.1,dz_back+0.2],[-0.2,dy_back_top-0.1,dz_back+0.2],[0,dy_back_top,dz_back]]);
cf_lteb = BEZIER(S0)([[0,0,dz_back],[-0.2,0,dz_back],[-0.2,dy_back_top,dz_back],[0,dy_back_top,dz_back]]);

var left_top_edge_back = COLOR(white)(surface([c1_lteb,c2_lteb,cf_lteb]));


c1_rightb = BEZIER(S0)([[dx_back,0,0],[dx_back,0,dz_back/8],[dx_back,0,dz_back/4],
						[dx_back,0,3*dz_back/8],[dx_back,3,2*dz_back/4],[dx_back,0,dz_back]]);
c2_rightb = BEZIER(S0)([[dx_back+0.2,0,0],[dx_back+0.2,0,dz_back/8],[dx_back+0.2,0,dz_back/4],
						[dx_back+0.2,0,3*dz_back/8],[dx_back+0.2,3,2*dz_back/4],[dx_back+0.2,0,dz_back]]);
c3_rightb = BEZIER(S0)([[dx_back+0.2,dy_back_low,0],[dx_back+0.2,dy_back_top+3,2*dz_back/4],[dx_back+0.2,dy_back_top,dz_back]]);
cf_rightb = BEZIER(S0)([[dx_back,dy_back_low,0],[dx_back,dy_back_top+3,2*dz_back/4],[dx_back,dy_back_top,dz_back]]);

var right_side_back = COLOR(white)(surface([c1_rightb, c2_rightb, c3_rightb, cf_rightb]));


c1_rteb = BEZIER(S0)([[dx_back,0,dz_back],[dx_back,0-0.1,dz_back+0.2],
						[dx_back,dy_back_top-0.1,dz_back+0.2],[dx_back,dy_back_top,dz_back]]);
c2_rteb = BEZIER(S0)([[dx_back,0,dz_back],[dx_back+0.2,0-0.1,dz_back+0.2],
					[dx_back+0.2,dy_back_top-0.1,dz_back+0.2],[dx_back,dy_back_top,dz_back]]);
cf_rteb = BEZIER(S0)([[dx_back,0,dz_back],[dx_back+0.2,0,dz_back],[dx_back+0.2,dy_back_top,dz_back],[dx_back,dy_back_top,dz_back]]);

var right_top_edge_back = COLOR(white)(surface([c1_rteb, c2_rteb, cf_rteb]));


c1_lleb = BEZIER(S0)([[0,dy_back_low,0],[0,dy_back_low-0.1,-0.1],[0,0,-0.1],[0,0,0]]);
c2_lleb = BEZIER(S0)([[0,dy_back_low,0],[-0.2,dy_back_low-0.1,-0.1],[-0.2,0,-0.1],[0,0,0]]);
cf_lleb = BEZIER(S0)([[0,dy_back_low,0],[-0.2,dy_back_low,0],[-0.2,0,0],[0,0,0]]);

var left_low_edge_back = COLOR(white)(surface([c1_lleb,c2_lleb,cf_lleb]));


c1_rleb = BEZIER(S0)([[dx_back,dy_back_low,0],[dx_back,dy_back_low-0.1,-0.1],[dx_back,0,-0.1],[dx_back,0,0]]);
c2_rleb = BEZIER(S0)([[dx_back,dy_back_low,0],[dx_back+0.2,dy_back_low-0.1,-0.1],[dx_back+0.2,0,-0.1],[dx_back,0,0]]);
cf_rleb = BEZIER(S0)([[dx_back,dy_back_low,0],[dx_back+0.2,dy_back_low,0],[dx_back+0.2,0,0],[dx_back,0,0]]);

var right_low_edge_back = COLOR(white)(surface([c1_rleb,c2_rleb,cf_rleb]));


var back = STRUCT([front_side_back, top_side_back, back_side_back, low_side_back, left_side_back, 
					left_top_edge_back, right_side_back, right_top_edge_back, left_low_edge_back, right_low_edge_back]);






/****************************** SEAT ******************************/

var dz_seat_back = 2;
var dz_seat_front = 3;
var dx_seat = dx_back;
var dy_seat = 10;


c1_bs = cf_bb;
cf_bs = BEZIER(S0)([[0,dy_back_low-0.6,-dz_seat_back],[dx_seat,dy_back_low-0.6,-dz_seat_back]]);

var back_side_seat = COLOR(white)(surface([c1_bs,cf_bs]));


c1_ts = c1_bs;
cf_ts = BEZIER(S0)([[0,dy_back_low-dy_seat,-1],[dx_seat,dy_back_low-dy_seat,-1]]);

var top_side_seat = COLOR(blue_persia)(surface([c1_ts,cf_ts]));


c1_fs = cf_ts;
c2_fs = BEZIER(S0)([[0,dy_back_low-dy_seat-5,-1.5],[dx_seat,dy_back_low-dy_seat-5,-1.5]]);
c3_fs = BEZIER(S0)([[0,dy_back_low-dy_seat-1-0.4,-1-dz_seat_front+0.1],[dx_seat,dy_back_low-dy_seat-1-0.4,-1-dz_seat_front+0.1]]);
cf_fs = BEZIER(S0)([[0,dy_back_low-dy_seat-1,-1-dz_seat_front],[dx_seat,dy_back_low-dy_seat-1,-1-dz_seat_front]]);

var front_side_seat = COLOR(blue_persia)(surface([c1_fs,c2_fs,c3_fs,cf_fs]));


c1_ls = cf_fs;
c2_ls = BEZIER(S0)([[0,dy_back_low-0.6-0.1,-dz_seat_back-0.4],[dx_seat,dy_back_low-0.6-0.1,-dz_seat_back-0.4]]);
cf_ls = cf_bs;

var low_side_seat = COLOR(white)(surface([c1_ls,c2_ls,cf_ls]));


c1_lefts = BEZIER(S0)([[0,dy_back_low,0],[0,dy_back_low-dy_seat,-1]]);
c2_lefts = BEZIER(S0)([[0-0.2,dy_back_low,0],[0-0.2,dy_back_low-dy_seat,-1]]);
c3_lefts = BEZIER(S0)([[0-0.2,dy_back_low-0.6,-dz_seat_back],[0-0.2,dy_back_low-0.6-0.1,-dz_seat_back-0.4],
						[0-0.2,dy_back_low-dy_seat-1,-1-dz_seat_front]]);
cf_lefts = BEZIER(S0)([[0,dy_back_low-0.6,-dz_seat_back],[0,dy_back_low-0.6-0.1,-dz_seat_back-0.4],
						[0,dy_back_low-dy_seat-1,-1-dz_seat_front]]);

var left_side_seat = COLOR(white)(surface([c1_lefts,c2_lefts,c3_lefts,cf_lefts]));


c1_rights = BEZIER(S0)([[dx_seat,dy_back_low,0],[dx_seat,dy_back_low-dy_seat,-1]]);
c2_rights = BEZIER(S0)([[dx_seat+0.2,dy_back_low,0],[dx_seat+0.2,dy_back_low-dy_seat,-1]]);
c3_rights = BEZIER(S0)([[dx_seat+0.2,dy_back_low-0.6,-dz_seat_back],[dx_seat+0.2,dy_back_low-0.6-0.1,-dz_seat_back-0.4],
						[dx_seat+0.2,dy_back_low-dy_seat-1,-1-dz_seat_front]]);
cf_rights = BEZIER(S0)([[dx_seat,dy_back_low-0.6,-dz_seat_back],[dx_seat,dy_back_low-0.6-0.1,-dz_seat_back-0.4],
						[dx_seat,dy_back_low-dy_seat-1,-1-dz_seat_front]]);

var right_side_seat = COLOR(white)(surface([c1_rights,c2_rights,c3_rights,cf_rights]));


c1_lfes = BEZIER(S0)([[0,dy_back_low-dy_seat,-1],[0,dy_back_low-dy_seat-5,-1.5],
						[0,dy_back_low-dy_seat-1-0.4,-1-dz_seat_front+0.1],[0,dy_back_low-dy_seat-1,-1-dz_seat_front]]);
c2_lfes = BEZIER(S0)([[0,dy_back_low-dy_seat,-1],[0-0.2,dy_back_low-dy_seat-2.5,-1.5],
						[0-0.2,dy_back_low-dy_seat-1-0.2,-1-dz_seat_front],[0,dy_back_low-dy_seat-1,-1-dz_seat_front]]);
cf_lfes = BEZIER(S0)([[0,dy_back_low-dy_seat,-1],[0-0.2,dy_back_low-dy_seat,-1],
						[0-0.2,dy_back_low-dy_seat-1,-1-dz_seat_front],[0,dy_back_low-dy_seat-1,-1-dz_seat_front]]);

var left_front_edge_seat = COLOR(white)(surface([c1_lfes,c2_lfes,cf_lfes]));


c1_rfes = BEZIER(S0)([[dx_seat,dy_back_low-dy_seat,-1],[dx_seat,dy_back_low-dy_seat-5,-1.5],
						[dx_seat,dy_back_low-dy_seat-1-0.4,-1-dz_seat_front+0.1],[dx_seat,dy_back_low-dy_seat-1,-1-dz_seat_front]]);
c2_rfes = BEZIER(S0)([[dx_seat,dy_back_low-dy_seat,-1],[dx_seat+0.2,dy_back_low-dy_seat-2.5,-1.5],
						[dx_seat+0.2,dy_back_low-dy_seat-1-0.2,-1-dz_seat_front],[dx_seat,dy_back_low-dy_seat-1,-1-dz_seat_front]]);
cf_rfes = BEZIER(S0)([[dx_seat,dy_back_low-dy_seat,-1],[dx_seat+0.2,dy_back_low-dy_seat,-1],
						[dx_seat+0.2,dy_back_low-dy_seat-1,-1-dz_seat_front],[dx_seat,dy_back_low-dy_seat-1,-1-dz_seat_front]]);

var right_front_edge_seat = COLOR(white)(surface([c1_rfes,c2_rfes,cf_rfes]));


c1_lbes = BEZIER(S0)([[0,dy_back_low,0],[0,dy_back_low-0.6,-dz_seat_back]]);
cf_lbes = BEZIER(S0)([[0,dy_back_low,0],[0-0.2,dy_back_low,0],
						[0-0.2,dy_back_low-0.6,-dz_seat_back],[0,dy_back_low-0.6,-dz_seat_back]])

var left_back_edge_seat = COLOR(white)(surface([c1_lbes,cf_lbes]));


c1_rbes = BEZIER(S0)([[dx_seat,dy_back_low,0],[dx_seat,dy_back_low-0.6,-dz_seat_back]]);
cf_rbes = BEZIER(S0)([[dx_seat,dy_back_low,0],[dx_seat+0.2,dy_back_low,0],
						[dx_seat+0.2,dy_back_low-0.6,-dz_seat_back],[dx_seat,dy_back_low-0.6,-dz_seat_back]])

var right_back_edge_seat = COLOR(white)(surface([c1_rbes,cf_rbes]));



var seat = STRUCT([back_side_seat, top_side_seat, front_side_seat, low_side_seat, left_side_seat, right_side_seat, 
					left_front_edge_seat, right_front_edge_seat, left_back_edge_seat, right_back_edge_seat]);





/****************************** PILLOW ******************************/


var pillows = R([1,2])([-PI/10])(STRUCT([back, seat]));




/****************************** LEGS ******************************/


// support function

var circumference = function (r,dx,dy,dz) {
	return function (v) {
		return [r*COS(v[0])+dx, r*SIN(v[0])+dy, dz];
	};
};


var domCyl = DOMAIN([[0,2*PI],[0,1]])([20,20]);

function cylinder(curves){
	return MAP(BEZIER(S1)(curves))(domCyl);
}

var torus = function (R,r){
	return function (arg){
		var a = arg[0];
		var b = arg[1];
		var u = (r*COS(a)+R) * COS(b);
		var v = (r*COS(a)+R) * SIN(b);
		var w = r*SIN(a);
		return [u,v,w];
	};
};

function circle(r, h) {
	var domain = DOMAIN([[0, 2*PI],[0,r]])([30,30]);
	var mapping = function(v) {
		var a = v[0];
		var r = v[1];

		return [r*COS(a), r*SIN(a), h];
	}

	model = MAP(mapping)(domain);

	return model;
} 

var radius = 0.15;
var distance = dx_back+2;
var h1 = 8;
var h2 = 10.1;


domain_angle_leg_1 = DOMAIN([[0, 2*PI],[0,PI/3]])([20,20]);

var angle_leg1 = R([1,2])([PI/6])(R([0,1])([PI])(R([0,2])([-PI/2])(MAP(torus(radius*2,radius))(domain_angle_leg_1))));


domain_angle_leg_2 = DOMAIN([[0, 2*PI],[0,PI/2]])([20,20]);

var angle_leg2_left = R([0,2])([-PI/2])(R([1,2])([PI/2])(MAP(torus(radius*6,radius))(domain_angle_leg_2)));

var angle_leg2_right = R([0,2])([-PI/2])(R([1,2])([-PI/2])(MAP(torus(radius*6,radius))(domain_angle_leg_2)));



cyl1_left = STRUCT([cylinder([circumference(radius-0.05,0,0,0), circumference(radius,0,0,h1)]), 
				T([1,2])([2*radius,h1])(angle_leg1), 
				T([1,2])([-(radius)/2,5])(CUBOID([1,radius,1.5]))]);

cyl1_right = STRUCT([cylinder([circumference(radius-0.05,0,0,0), circumference(radius,0,0,h1)]), 
				T([1,2])([2*radius,h1])(angle_leg1), 
				T([0,1,2])([-1,-(radius)/2,5])(CUBOID([1,radius,1.5]))]);


cyl2_left = T([1,2])([radius,h1+(radius*2)-0.04])(R([1,2])([-PI/3])
	(STRUCT([cylinder([circumference(radius,0,0,0), circumference(radius,0,0,dy_seat)]), 
			T([0,2])([radius*6,dy_seat])(angle_leg2_left)])));

cyl2_right = T([1,2])([radius,h1+(radius*2)-0.04])(R([1,2])([-PI/3])
	(STRUCT([cylinder([circumference(radius,0,0,0), circumference(radius,0,0,dy_seat)]), 
			T([0,2])([-radius*6,dy_seat])(angle_leg2_right)])));


cyl3_left = T([1,2])([dy_seat+4,5])(R([1,2])([PI/4])
	(STRUCT([cylinder([circumference(radius-0.05,0,0,0),circumference(radius,0,0,h2)]), 
			T([1,2])([-(radius)/2,6])(CUBOID([1,radius,1.5]))])));

cyl3_right = T([1,2])([dy_seat+4,5])(R([1,2])([PI/4])
	(STRUCT([cylinder([circumference(radius-0.05,0,0,0),circumference(radius,0,0,h2)]), 
			T([0,1,2])([-1,-(radius)/2,6])(CUBOID([1,radius,1.5]))])));


var pillars_left = R([1,2])([-PI/10])(STRUCT([cyl1_left, cyl2_left, cyl3_left]));
var pillars_right = R([1,2])([-PI/10])(STRUCT([cyl1_right, cyl2_right, cyl3_right]));


r_base = (radius-0.05)*2;
h_base = 0.15;

var base = STRUCT([cylinder([circumference(r_base,0,0,0),circumference(r_base,0,0,h_base)]), 
				circle(r_base,0),circle(r_base,h_base)]);


var left_leg = STRUCT([pillars_left, T([1,2])([0.02,-0.1])(base), T([1,2])([dy_seat+4.81,0.35])(base)]);

var right_leg = STRUCT([pillars_right, T([1,2])([0.02,-0.1])(base), T([1,2])([dy_seat+4.81,0.35])(base)]);


left_leg = T([0,1,2])([-1,-dy_seat, -(h1-2.5)])(left_leg);

right_leg = T([0,1,2])([-1+distance,-dy_seat, -(h1-2.5)])(right_leg);


var legs = COLOR(gold)(STRUCT([left_leg, right_leg]));



/****************************** ARMRESTS ******************************/

dx_arm = 0.8;
dy_arm = 10;
dz_arm= 0.8;
curve_depht = 0.5;


c1 = BEZIER(S0)([[0, 0, dz_arm],[dx_arm, 0, dz_arm]]);
c2 = BEZIER(S0)([[-curve_depht, -curve_depht, dz_arm],[curve_depht+dx_arm, -curve_depht, dz_arm]]);
c3 = BEZIER(S0)([[-curve_depht, -curve_depht, 0],[curve_depht+dx_arm, -curve_depht, 0]]);
c4 = BEZIER(S0)([[0, 0, 0],[dx_arm, 0, 0]]);

c5 = BEZIER(S0)([[0, 0, dz_arm],[0, dy_arm, dz_arm]]);
c6 = BEZIER(S0)([[-curve_depht, -curve_depht, dz_arm],[-curve_depht, curve_depht+dy_arm, dz_arm]]);
c7 = BEZIER(S0)([[-curve_depht, -curve_depht, 0],[-curve_depht, curve_depht+dy_arm, 0]]);
c8 = BEZIER(S0)([[0, 0, 0],[0, dy_arm, 0]]);

c9 = BEZIER(S0)([[0, dy_arm, dz_arm],[dx_arm, dy_arm, dz_arm]]);
c10 = BEZIER(S0)([[-curve_depht, curve_depht+dy_arm, dz_arm],[curve_depht+dx_arm, curve_depht+dy_arm, dz_arm]]);
c11 = BEZIER(S0)([[-curve_depht, curve_depht+dy_arm, 0],[curve_depht+dx_arm, curve_depht+dy_arm, 0]]);
c12 = BEZIER(S0)([[0, dy_arm, 0],[dx_arm, dy_arm, 0]]);

c13 = BEZIER(S0)([[dx_arm, 0, dz_arm],[dx_arm, dy_arm, dz_arm]]);
c14 = BEZIER(S0)([[curve_depht+dx_arm, -curve_depht, dz_arm],[curve_depht+dx_arm, curve_depht+dy_arm, dz_arm]]);
c15 = BEZIER(S0)([[curve_depht+dx_arm, -curve_depht, 0],[curve_depht+dx_arm, curve_depht+dy_arm, 0]]);
c16 = BEZIER(S0)([[dx_arm, 0, 0],[dx_arm, dy_arm, 0]]);


var armrest = R([1,2])([(PI/6)-(PI/10)])(COLOR(white)(STRUCT([CUBOID([dx_arm,dy_arm,dz_arm]), surface([c1,c2,c3,c4]), 
					surface([c5,c6,c7,c8]), surface([c9,c10,c11,c12]), surface([c13,c14,c15,c16])])));


var armrests = STRUCT([T([0,1,2])([-dx_arm-0.6,-8.5,2.2])(armrest), 
						T([0,1,2])([-dx_arm-0.6+distance,-8.5,2.2])(armrest)]);



/****************************** ARMCHAIR ******************************/

var armchair = STRUCT([pillows, legs, armrests]);
DRAW(armchair);