import EntityIssue from "./issues/entity-issue.js";
import { rulesNames } from "./rules.js";
let issues;
/**
 * Check entities for lint issues.
 * That is done by passing the list of entity declarations from the CST (from the JDLReader output).
 * @param entityDeclarations - the list of entity declarations
 * @return the found entity issues.
 */
export function checkEntities(entityDeclarations) {
    if (!entityDeclarations) {
        return [];
    }
    issues = [];
    checkForDuplicatedEntities(entityDeclarations);
    entityDeclarations.forEach(entityDeclaration => {
        checkForUselessEntityBraces(entityDeclaration);
    });
    return issues;
}
function checkForDuplicatedEntities(entityDeclarations) {
    const entityNames = new Set();
    const duplicatedEntityIssues = new Map(); // key: entityName, value: issue
    entityDeclarations.forEach(entityDeclaration => {
        const entityName = entityDeclaration.children.NAME[0].image;
        if (entityNames.has(entityName)) {
            if (!duplicatedEntityIssues.has(entityName)) {
                duplicatedEntityIssues.set(entityName, new EntityIssue({
                    ruleName: rulesNames.ENT_DUPLICATED,
                    entityName,
                }));
            }
        }
        else {
            entityNames.add(entityName);
        }
    });
    duplicatedEntityIssues.forEach(issue => {
        issues.push(issue);
    });
}
function checkForUselessEntityBraces(entityDeclaration) {
    const { entityBody } = entityDeclaration.children;
    const nextTokensAfterRelationshipType = entityBody?.[0]?.children;
    const onlyCurlyBracesAsRelationshipBody = entityBody && Object.keys(nextTokensAfterRelationshipType).length === 2;
    if (onlyCurlyBracesAsRelationshipBody) {
        issues.push(new EntityIssue({
            ruleName: rulesNames.ENT_SHORTER_DECL,
            entityName: entityDeclaration.children.NAME[0].image,
        }));
    }
}
