import Logic from '../Logic';

import Box from './Box';

/** @module editorElements.OutputBox */

/**
 * OutputBox has only input connectors and is used to visualize the output states of the logic network.
 * @extends Box
 */
export default class OutputBox extends Box {
    /**
     * @param {App} appInstance  instance of [App](./module-App.html)
     */
    constructor(appInstance) {
        const gridHeight = 4;
        const gridWidth = 5;

        super(appInstance, 'output', 'other', gridWidth, gridHeight);

        this.addConnector(0, gridHeight / 2, true);

        this.generateBlockNodes();
    }

    /**
     * set state of this output box to match the state of its input connector
     */
    refreshState() {
        this.setState(this.connectors[0].state);
    }

    /**
     * Reflect the input connector state in the appearance of the element - set
     * the element image to represent the corresponding state
     * @param {Logic.state} state new state of this outputBox
     */
    setState(state) {
        if (state === Logic.state.on) {
            if (this.appInstance.tutorial) {
                this.appInstance.tutorial.onOutputBoxTrue();
            }
        }

        let stateMap = {};
        stateMap[Logic.state.on] = 'on';
        stateMap[Logic.state.off] = 'off';
        stateMap[Logic.state.unknown] = '';
        stateMap[Logic.state.oscillating] = 'osc';

        this.changeImage(stateMap[state]);
    }

    generateBlockNodes() {
        // block the input connector node
        const specialNode = {
            x: 0,
            y: this.gridHeight / 2
        };
        super.generateBlockNodes(0, 0, 0, 1, specialNode);
    }
}