Source: package/geometry/geometry.js

import { Reporter } from '../../reporter/reporter.js';
import { checkPropTypes } from '../../lib.js';
import { BuildableComponent } from '../component/buildable_component.js';
import { GeometryFile } from '../geometry/geometry_file.js';
import { Project } from '../../project.js';

/** ProductBuilder Geometry */

class Geometry extends BuildableComponent {

    /**
     * @param {Reporter} reporter
     * @param {Object} settings
     * @param {UUID} [settings.id]
     * @param {string} [settings.name]
     * @param {string} settings.geometryName
     * @param {Array<GeometryFile>} settings.file
     */

    constructor(reporter, settings) {

        super(
            reporter,
            settings,
            {
                parse: {
                    file: 'alternatives'
                }
            }
        );

        checkPropTypes(
            settings,
            {
                file: val => Array.isArray(val) ? val.every(file => file instanceof GeometryFile ) : val instanceof GeometryFile,
                geometryName: 'string'
            },
            {}
        );

        // this.exportName = 'geometries';
    }

    static _exportName = {
        singular: 'geometry',
        plural: 'geometries'
    };


    /**
     * @param {ComponentPart} part
     * @param {LoadingQuality} quality 
     * @returns {Promise<Geometry>}
     */

    async _build(part, quality, dependencies) {

        this._status[ part ][ quality ].setState( 'loading' );

        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':

                // dependencies in function argument should contain only the 
                // selected (ready) geo file of the potentially multiple alternatives

                // console.log( 'build geo', this._settings)

                this._setContent(
                    'main',
                    quality,
                    dependencies.file.content.main[ quality ].geometries[ this._settings.geometryName ]
                );

                break;
                
            default:

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

        return this;
    }
}

export { Geometry };