'use strict';
import { html } from 'the-dom';
import { getColor } from './utils';
import { createRegularVertices, scaleVertices, applyChaos } from './chaos';
const { body } = html(document);
const content = body.find('#content');
const verticesRange = body.find('#vertices');
const fractionRange = body.find('#fraction');
const plotting = body.find('#plotting').node;
const ctx = plotting.getContext('2d');
const padding = 40; // padding between the canvas edges and the points
let width, height, vertices;
/**
 * Re-render the scene from scratch
 *
 * @return {null}
 */
const render = () => {
    const fraction = 1 / parseFloat(fractionRange.node.value);
    const scaledVerts = scaleVertices(width, height, vertices);
    plotting.width = width + 2 * padding;
    plotting.height = height + 2 * padding;
    // do not plot (very) small sizes
    if (width < 1) {
        return;
    }
    // draw the polygon
    ctx.strokeStyle = '#aaa';
    ctx.lineWidth = 1;
    ctx.beginPath();
    for (let i = 0; i < vertices.length; i += 1) {
        ctx.lineTo(scaledVerts[i][0] + padding, scaledVerts[i][1] + padding);
    }
    ctx.closePath();
    ctx.stroke();
    // draw the vertices
    for (let i = 0; i < vertices.length; i += 1) {
        ctx.beginPath();
        ctx.fillStyle = 'rgb(' + getColor(i).join(', ') + ')';
        ctx.arc(
            scaledVerts[i][0] + padding, scaledVerts[i][1] + padding,
            4, 0, Math.PI * 2
        );
        ctx.fill();
    }
    // do the chaos game
    const image = ctx.getImageData(padding, padding, width, height);
    applyChaos(image, fraction, scaledVerts);
    ctx.putImageData(image, padding, padding);
};
/**
 * Update the scene when the window has been resized
 *
 * @return {null}
 */
const resize = () => {
    width = content.node.clientWidth - 2 * padding;
    height = content.node.clientHeight - 2 * padding;
    render();
};
/**
 * Create new vertices
 */
verticesRange.on('input', () => {
    vertices = createRegularVertices(
        parseInt(verticesRange.node.value, 10)
    );
    render();
});
window.onresize = resize;
fractionRange.on('input', render);
vertices = createRegularVertices(3);
resize();