Source: Project/VwProject/VwProject.js

import VwForm from "../VwForm/VwForm";
import VwProjectUtils from "./VwProjectUtils";
/**
 * Herramientas para gestionar los proyectos de una solución
 * @param {VProjectInfo} [vWProjectInfo=theApp.mainProjectInfo()] {@link https://doc.velneo.es/vprojectinfo.html|VProjectInfo}
 */
export default class VwProject {
    constructor(projectInfo=undefined) {
        if(projectInfo) {
            /**
             * Contiene el [vProjectInfo]{@link https://doc.velneo.com/velneo-vdevelop/scripts/lenguajes/javascript/clases/vprojectinfo} pasado en el constructor
             * @type {object}
             */
            this.projectInfo = projectInfo;
        } else {
            this.projectInfo = theApp.mainProjectInfo();
        }
    }

    /**
     * Nombre del proyecto
     * @type {string}
     */
    get name() {
        return this.projectInfo.name();
    }

    /**
     * Tipo de proyecto. [Valores]{@link https://doc.velneo.com/velneo-vdevelop/scripts/lenguajes/javascript/clases/vprojectinfo#enumeraciones}
     * @type {int}
     */
    get type() {
        return this.projectInfo.type();
    }

    /**
     * Alias del proyecto
     * @type {string}
     */
    get alias() {
        return this.projectInfo.alias();
    }

    /**
     * Devuelve un array de {@link VwProject} de tipo aplicación
     * @returns {VwProject[]}
     * 
     */
    getInheritedAppProjects() {
        // Returns an array of app projects
        return VwProject.getInheritedProjectList(this.projectInfo, 1);
    }

    /**
     * Devuelve un array de {@link VwProject} de tipo datos
     * @returns {VwProject[]}
     */
    getInheritedDatProjects() {
        // Returns an array of dat projects
        return VwProject.getInheritedProjectList(this.projectInfo, 0)
    }

    /**
     * Array de [VObjectInfo]{@link https://doc.velneo.com/velneo-vdevelop/scripts/lenguajes/javascript/clases/vobjectinfo} de las tablas
     * @type {Object[]} 
     */
    get tables() {
        // Returns an array of tableInfo
        if (this.projectInfo.type() != 0) {
            throw new Error('VwProject.getTables needs a dat type project as argument');
        }

        const tables = [];
        const numTables = this.tableCount();

        for (let i = 0; i < numTables; i++) {
            const vWTableInfo = this.tableInfo(i);
            tables.push(vWTableInfo);
        }

        return tables;
    }

    /**
     * Devuelve los formularios del proyecto
     * @type {VwForm[]}
     */
    get forms() {
        // Return an array of vObjectInfo of forms
        if (this.projectInfo.type() != 1) {
            throw new Error('VwProject.forms needs a app type project as argument');
        }

        const forms = [];
        const typeFormCode = 18;
        const numObjects = this.projectInfo.objectCount(typeFormCode);

        for (let i = 0; i < numObjects; i++) {
            const form = new VwForm(this.projectInfo.objectInfo(typeFormCode, i));
            forms.push(form);
        }
        return forms;
    }

    /**
     * Devuelve los proyectos heredados
     * @param {*} startingProject Proyecto del que se quieren obtener herencias
     * @param {*} [projectType=undefined] Tipo de proyecto
     * @param {*} [foundProjects=[]] Resultados previos para llamadas recursivas del propio método. Se recomienda no inicializar
     * @returns 
     */
    static getInheritedProjectList(startingProject, projectType=undefined, foundProjects=[]) {
        const projects = [];
        const found = foundProjects;

        if(projectType == undefined || projectType == startingProject.type()) {
            if(!VwProjectUtils.checkExistingProject(found, startingProject)) {
                projects.push(startingProject);
                found.push(startingProject);
            }
        }

        for (var i=0; i<startingProject.legacyProjectCount(); i++) {
            var project = startingProject.legacyProjectInfo(i);
            if(!projectType == undefined || projectType == project.type()) {
                if(!VwProjectUtils.checkExistingProject(found, project)) {
                    projects.push(project);
                    found.push(project);
                }

                if(project.legacyProjectCount() > 0) {
                    projects.push(...VwProject.getInheritedProjectList(project, projectType, found));
                }
            } else {
                if(project.legacyProjectCount() > 0) {
                    projects.push(...VwProject.getInheritedProjectList(project, projectType, found));
                }
            }
        }
        return projects;
    }

    /**
     * Obtiene los vObjectInfo del tipo especificado del proyecto
     * @param {object} project [VProyectInfo]{@link https://doc.velneo.com/velneo-vdevelop/scripts/lenguajes/javascript/clases/vprojectinfo}
     * @param {int} objectType [Enumeración]{@link https://doc.velneo.com/velneo-vdevelop/scripts/lenguajes/javascript/clases/vobjectinfo/vobjectinfo-enumeraciones#tipos-de-objetos}
     * @returns {object[]} Array de [VObjectInfo]{@link https://doc.velneo.com/velneo-vdevelop/scripts/lenguajes/javascript/clases/vobjectinfo}
     */
    getProjectObjects(project, objectType) {
        var objectList = [];
        var objectCount = project.allObjectCount(objectType);

        for(var i=0; i<objectCount; i++) {
            var objectInfo = project.objectInfo(objectType, i)
            objectList.push(objectInfo);
        }

        return objectList;
    }
}