# -*- coding: utf-8 -*-
"""
Script para detectar si un Excel es formato DIAN o SIIGO
Se ejecuta así: python detectar_formato.py <ruta_archivo>
"""
import sys
import json
from config import KEYWORDS_SIIGO, KEYWORDS_DIAN, COLUMNAS_CRITICAS
from utils import obtener_columnas_excel, retornar_error, retornar_respuesta, normalizar_string

def detectar_formato(ruta_archivo):
    """
    Detecta si un Excel es DIAN o SIIGO analizando las columnas presentes.
    Retorna: {"formato": "DIAN|SIIGO", "columnas": [...], "metadata": {...}}
    """
    try:
        columnas = obtener_columnas_excel(ruta_archivo)

        if not columnas:
            retornar_error("El archivo no tiene columnas o está vacío")
            return

        # Normalizar columnas para búsqueda
        columnas_norm = {normalizar_string(col): col for col in columnas}

        # Contar keywords SIIGO y DIAN
        count_siigo = sum(1 for kw in KEYWORDS_SIIGO if any(kw.lower() in cn for cn in columnas_norm.keys()))
        count_dian = sum(1 for kw in KEYWORDS_DIAN if any(kw.lower() in cn for cn in columnas_norm.keys()))

        # Detectar formato
        if count_siigo > count_dian:
            formato = "SIIGO"
        elif count_dian > count_siigo:
            formato = "DIAN"
        else:
            # Si no hay diferencia clara, asumir DIAN por defecto (es el formato oficial)
            formato = "DIAN"

        # Contar columnas críticas presentes
        criticas_presentes = 0
        criticas_faltantes = []

        for col_critica in COLUMNAS_CRITICAS:
            col_critica_norm = normalizar_string(col_critica)
            if any(col_critica_norm in cn or cn in col_critica_norm for cn in columnas_norm.keys()):
                criticas_presentes += 1
            else:
                criticas_faltantes.append(col_critica)

        metadata = {
            "total_columnas": len(columnas),
            "columnas_criticas_presentes": criticas_presentes,
            "columnas_criticas_faltantes": criticas_faltantes,
            "keywords_siigo_encontrados": count_siigo,
            "keywords_dian_encontrados": count_dian,
        }

        retornar_respuesta(True, {
            "formato": formato,
            "columnas": columnas,
            "metadata": metadata,
        })

    except Exception as e:
        retornar_error(str(e))

if __name__ == "__main__":
    if len(sys.argv) < 2:
        retornar_error("Uso: python detectar_formato.py <ruta_archivo>")

    ruta = sys.argv[1]
    detectar_formato(ruta)
