import fs from 'fs';
import path from 'path';
import https from 'https';
import { fileURLToPath } from 'url';

const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

/**
 * AUTO-SYNC AGENT FOR ROUTE DOCUMENTATION
 */

const CONTRATOS_DIR = path.join(__dirname, '../src/features/dev-tools/data/contratos');

const MONITORED_ROUTES = [
    { env: 'prafrot', path: '/cadastro_frota/apresentar', method: 'GET', resource: 'cadastro_frota' },
    { env: 'prafrot', path: '/motoristas/listagem', method: 'GET', resource: 'motoristas' },
    { env: 'prafrot', path: '/dispatcher/apresentar', method: 'GET', resource: 'dispatcher' },
    { env: 'prafrot', path: '/oficinas_frota/apresentar', method: 'GET', resource: 'oficinas_frota' },
    { env: 'prafrot', path: '/monitoramento_frota/apresentar', method: 'GET', resource: 'monitoramento_frota' },
    { env: 'prafrot', path: '/status_frota/apresentar', method: 'GET', resource: 'status_frota' },
    { env: 'prafrot', path: '/manutencao_frota/apresentar', method: 'GET', resource: 'manutencao_frota' },
    { env: 'prafrot', path: '/sinistro_devolucao_venda_frota/apresentar', method: 'GET', resource: 'sinistro_devolucao_venda_frota' },
    { env: 'workspace', path: '/extrato/apresentar', method: 'GET', resource: 'extrato' },
    { env: 'workspace', path: '/categorias/apresentar', method: 'GET', resource: 'categorias' },
    { env: 'workspace', path: '/caixinhas/apresentar', method: 'GET', resource: 'caixinhas' },
    { env: 'workspace', path: '/contas_a_pagar/apresentar', method: 'GET', resource: 'contas_a_pagar' },
    { env: 'rh', path: '/colaboradores/apresentar', method: 'GET', resource: 'colaboradores' },
    { env: 'financeiro-v2', path: '/boletos/apresentar', method: 'GET', resource: 'boletos' },
    { env: 'gr', path: '/gr/contratos', method: 'GET', resource: 'contratos' },
];

function inferType(value) {
    if (value === null) return 'object';
    if (Array.isArray(value)) return 'array';
    return typeof value;
}

function inferDescription(key, value) {
    if (key.includes('data')) return 'Data';
    if (typeof value === 'boolean' || (typeof value === 'string' && ['SIM', 'NÃO'].includes(value))) return "'SIM' ou 'NÃO' / Booleano";
    if (value === null) return 'Pode ser null';
    return '';
}

const MOCK_API_RESPONSES = {
    '/cadastro_frota/apresentar': { "ano_fabricacao": "2", "idveiculo_frota": 3638, "placa": "ABC1234", "geotab": "SIM" },
    '/motoristas/listagem': { "NOME_FAVORECIDO": "ACAUAN DUQUE", "idfavorecido": 1 },
    '/dispatcher/apresentar': { "nome": "Rafael", "email": "rafael@pralog.com.br" },
    '/oficinas_frota/apresentar': { "razao_social": "REPECOL LTDA", "idoficinas_frota": 2 },
    '/monitoramento_frota/apresentar': { "placa": "XYZ5678", "idmonitoramento_frota": 738 },
    '/status_frota/apresentar': { "status_frota": "Em Trânsito", "idstatus_frota": 2412 },
    '/manutencao_frota/apresentar': { "oficina": "D CARROS CENTER", "idmanutencao_frota": 13176 },
    '/sinistro_devolucao_venda_frota/apresentar': { "status": "Desmobilizado", "idsinistro_devolucao_frota": 871 },
    '/extrato/apresentar': { "idextrato": 101, "descricao": "Venda Loja", "valor": 1500.50 },
    '/categorias/apresentar': { "id": 1, "nome": "Vendas" },
    '/caixinhas/apresentar': { "id": 1, "nome": "Principal" },
    '/contas_a_pagar/apresentar': { "id": 1, "valor": 500.00 },
    '/colaboradores/apresentar': { "id": 1, "nome": "João Silva", "cargo": "Analista" },
    '/boletos/apresentar': { "id": 1, "valor": 1200.00 },
    '/gr/contratos': { "id": 1, "cliente": "Empresa X" }
};

async function updateDocs() {
    console.log(`🤖 Agente Auto-Sync Iniciado`);
    const ENVS = [...new Set(MONITORED_ROUTES.map(r => r.env))];

    for (const envId of ENVS) {
        const targetFile = path.join(CONTRATOS_DIR, `${envId}-routes.json`);
        let contractData = { ambiente: envId, label: envId, rotas: [] };
        
        try {
            if (fs.existsSync(targetFile)) {
                contractData = JSON.parse(fs.readFileSync(targetFile, 'utf8'));
            }
        } catch (e) { console.error(`Erro ao ler ${envId}:`, e); continue; }

        const envRoutes = MONITORED_ROUTES.filter(r => r.env === envId);
        console.log(`\n📂 Ambiente: ${envId.toUpperCase()}`);

        for (const route of envRoutes) {
            console.log(`   ⚡ Rota: ${route.method} ${route.path}`);
            const responseData = MOCK_API_RESPONSES[route.path];
            if (!responseData) continue;

            const newResponseShape = Object.entries(responseData).map(([key, value]) => ({
                field: key,
                type: inferType(value),
                description: inferDescription(key, value)
            })).sort((a, b) => a.field.localeCompare(b.field));

            let routeEntry = contractData.rotas.find(r => r.recurso === route.resource);
            if (!routeEntry) {
                routeEntry = { id: `${route.resource}-auto`, recurso: route.resource, operations: [] };
                contractData.rotas.push(routeEntry);
            }

            let operation = routeEntry.operations.find(op => op.path === route.path && op.method === route.method);
            if (!operation) {
                operation = { method: route.method, path: route.path, descricao: `Auto-gerado`, responseShape: [] };
                routeEntry.operations.push(operation);
            }
            operation.responseShape = newResponseShape;
        }
        fs.writeFileSync(targetFile, JSON.stringify(contractData, null, 2), 'utf8');
    }
    console.log(`\n✅ Sincronização concluída!`);
}

updateDocs();
