Source: package/connector/connector_type.js

import { BuildableComponent } from '../component/buildable_component.js';
import { Reporter } from '../../reporter/reporter.js';
import { checkPropTypes } from '../../lib.js';
import { Connector } from './connector.js';
import { WrappedImage } from '../image/wrapped_image.js';
import { Project } from '../../project.js';

/** Connector */
class ConnectorType extends BuildableComponent {


    /**
     * @param {Reporter} reporter
     * @param {Object} settings
     * @param {UUID} [settings.id]
     * @param {string} settings.name
     * @param {WrappedImage} [settings.thumbnail]
     */
    //  * @param {Package} settings.pkg

    constructor(reporter, settings) {

        // this component should not be auto linked in parent class

        super(reporter, settings, { autoLinkDependencies: false });

        checkPropTypes(
            settings,
            {
                name: 'string'
            },
            {}
        );

        // this.exportName = 'connectorTypes';

        if (settings.thumbnail) {
            this._dependencies.UI = { thumbnail: settings.thumbnail };
        }


    }

    static _exportName = {
        singular: 'connectorType',
        plural: 'connectorTypes'
    };



    /** @type {Array<Connector>} */

    // _connectors = [];

    get connectors() {
        if (this._tree) {
            return this._tree.connectorsByType[this];
        }
        else {
            return [];
        }
    }

    _onTreeSet() {
        const component = this;

        this._tree.on(
            'change',
            ({ cls = [] }) => {
                if (cls.includes(Connector)) {
                    component.report({ msg: 'Connector changed in package. Rebuilding.' });
                    this._rebuild();
                }
            },
            this.id
        );

        this._rebuild();
    }

    _onTreeUnset() {
        if (this._tree.hasListener('change', this.id)) {
            this._tree.removeListener('change', this.id);
        }
    }


    /**
     * Collect material categories of this type from the package
     * @protected
     */




    async _build(part, quality) {

        switch (part) {

            case 'UI':
                if (this._settings.thumbnail) {
                    this._setContent('UI', quality, this._settings.thumbnail.content.main[quality]);
                }
                else {
                    this._setContent('UI', quality, Project.defaultImages.missing.cloneNode(true));
                }
                break;

            case 'main':

                const connectors = this._tree?.connectors ? this._tree.connectors.filter(con => con.settings.type === this) : [];

                // settings all qualities immediately here, triggers a cascade of _autoStatusUpdates => _build that results in errors

                // for (let setQuality of Component.qualities) {

                //     this._setContent('main', setQuality, connectors);

                // }

                
                this._setContent('main', quality, connectors);

                // zou de content hier niet een helper in een bep kleur moeten zijn?
                // de connector kan die dan clonen en plaatsen

                break;

            default:

                this._setContent(part, quality, null);
                
                break;
        }

        return this;
    }


}

export { ConnectorType };