import { shouldWriteEntityTableName } from '../utils/entity-table-name-creator.js';
import EntityIssue from './issues/entity-issue.js';
import { rulesNames } from './rules.js';
let issues;
export function checkEntities(entityDeclarations) {
    if (!entityDeclarations) {
        return [];
    }
    issues = [];
    checkForDuplicatedEntities(entityDeclarations);
    entityDeclarations.forEach(entityDeclaration => {
        checkForUselessEntityBraces(entityDeclaration);
        checkForUselessTableName(entityDeclaration);
    });
    return issues;
}
function checkForDuplicatedEntities(entityDeclarations) {
    const entityNames = new Set();
    const duplicatedEntityIssues = new Map();
    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.entityBody;
    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,
        }));
    }
}
function checkForUselessTableName(entityDeclaration) {
    const entityName = entityDeclaration.children.NAME[0].image;
    const entityTableNameDeclaration = entityDeclaration.children.entityTableNameDeclaration;
    if (entityTableNameDeclaration) {
        const tableName = entityTableNameDeclaration[0].children.NAME[0].image;
        if (!shouldWriteEntityTableName(entityName, tableName)) {
            issues.push(new EntityIssue({
                ruleName: rulesNames.ENT_OPTIONAL_TABLE_NAME,
                entityName,
            }));
        }
    }
}
