/**
 * Clasificación de filas de historial alineada con las tablas (badges Exitoso / Error / Desconocido).
 * Solo "Exitoso" cuenta como registro procesado a efectos del resumen del modal.
 */

export type IntegracionRowStatus = 'success' | 'error' | 'unknown';

function parseRespuestaPayload(respuesta: unknown): Record<string, unknown> | null {
    if (respuesta == null || respuesta === '') {
        return null;
    }

    if (typeof respuesta === 'object' && !Array.isArray(respuesta)) {
        return respuesta as Record<string, unknown>;
    }

    if (typeof respuesta === 'string') {
        const trimmed = respuesta.trim();
        if (!trimmed) {
            return null;
        }

        try {
            const parsed = JSON.parse(trimmed);
            if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
                return parsed as Record<string, unknown>;
            }
        } catch {
            return null;
        }
    }

    return null;
}

function hasMeaningfulError(value: unknown): boolean {
    if (value == null) {
        return false;
    }

    if (typeof value === 'boolean') {
        return value;
    }

    if (typeof value === 'number') {
        return value !== 0;
    }

    if (typeof value === 'string') {
        const trimmed = value.trim().toLowerCase();
        return trimmed !== '' && trimmed !== 'null' && trimmed !== 'undefined';
    }

    if (typeof value === 'object') {
        return Object.keys(value as object).length > 0;
    }

    return false;
}

function hasIdContrato(value: unknown): boolean {
    if (value == null) {
        return false;
    }

    if (typeof value === 'number') {
        return value > 0;
    }

    if (typeof value === 'string') {
        const trimmed = value.trim();
        return trimmed !== '' && trimmed !== '0' && trimmed.toLowerCase() !== 'null';
    }

    return false;
}

function isResultadoOk(value: unknown): boolean {
    if (typeof value !== 'string') {
        return false;
    }

    return ['ok', 'success', 'okay'].includes(value.trim().toLowerCase());
}

function isResultadoKo(value: unknown): boolean {
    if (typeof value !== 'string') {
        return false;
    }

    return ['ko', 'error', 'fail', 'nok', 'failed'].includes(value.trim().toLowerCase());
}

/**
 * Éxito ADX / integración:
 * { "id_contrato": "...", "resultado": "OK", "error": null }
 */
export function getIntegracionRowStatus(respuesta: unknown): IntegracionRowStatus {
    if (respuesta == null || respuesta === '') {
        return 'unknown';
    }

    const payload = parseRespuestaPayload(respuesta);

    if (payload) {
        const resultado = payload.resultado ?? payload.Resultado ?? payload.status;
        const errorValue = payload.error ?? payload.Error ?? null;
        const idContrato =
            payload.id_contrato ??
            payload.idContrato ??
            payload.contract_id ??
            payload.contractId ??
            payload.ids ??
            null;

        if (isResultadoOk(resultado) && !hasMeaningfulError(errorValue) && hasIdContrato(idContrato)) {
            return 'success';
        }

        if (isResultadoOk(resultado) && !hasMeaningfulError(errorValue)) {
            return 'success';
        }

        if (isResultadoKo(resultado) || hasMeaningfulError(errorValue)) {
            return 'error';
        }

        if (typeof payload.success === 'boolean') {
            return payload.success ? 'success' : 'error';
        }

        if (hasIdContrato(idContrato) && !hasMeaningfulError(errorValue)) {
            return 'success';
        }
    }

    // Legacy Audax: respuestas numéricas o texto plano sin JSON estructurado.
    const respuestaStr =
        typeof respuesta === 'string'
            ? respuesta.toLowerCase()
            : JSON.stringify(respuesta).toLowerCase();

    // No tratar la clave "error":null como fallo (ADX incluye el campo aunque vaya vacío).
    const hasErrorKeyWithValue =
        /"error"\s*:\s*(?!null\b)(?!"")(?!'')(?!undefined\b)/i.test(respuestaStr) ||
        /\berror\s*[:=]\s*(?!null\b)(?!"")(?!'')\S+/i.test(respuestaStr);

    if (hasErrorKeyWithValue || respuestaStr.includes('failed')) {
        return 'error';
    }

    if (respuestaStr.includes('success') || /\bresultado"\s*:\s*"ok"/i.test(respuestaStr) || /\dok\b/.test(respuestaStr) || /\d+/.test(respuestaStr)) {
        return 'success';
    }

    return 'unknown';
}

export function isIntegracionRowProcessed(respuesta: unknown): boolean {
    return getIntegracionRowStatus(respuesta) === 'success';
}

export type OkCommercialRowStatus = 'success' | 'error' | 'warning' | 'unknown';

export function getOkCommercialRowStatus(respuesta: unknown): OkCommercialRowStatus {
    if (respuesta == null || respuesta === '') {
        return 'unknown';
    }

    if (typeof respuesta === 'object' && respuesta !== null && 'success' in respuesta) {
        const s = (respuesta as { success?: boolean }).success;
        if (typeof s === 'boolean' && s === false) {
            return 'error';
        }
    }

    if (typeof respuesta === 'object' && respuesta !== null && 'status_code' in respuesta) {
        const statusCode = Number((respuesta as { status_code?: number }).status_code);
        if (Number.isFinite(statusCode)) {
            if (statusCode >= 200 && statusCode < 300) {
                return 'success';
            }
            if (statusCode >= 400) {
                return 'error';
            }
        }
    }

    const payload = parseRespuestaPayload(respuesta);
    if (payload) {
        if (isResultadoOk(payload.resultado) && !hasMeaningfulError(payload.error)) {
            return 'success';
        }
        if (isResultadoKo(payload.resultado) || hasMeaningfulError(payload.error)) {
            return 'error';
        }
    }

    const respuestaStr =
        typeof respuesta === 'string'
            ? respuesta.toLowerCase()
            : JSON.stringify(respuesta).toLowerCase();

    const hasErrorKeyWithValue =
        /"error"\s*:\s*(?!null\b)(?!"")(?!'')(?!undefined\b)/i.test(respuestaStr) ||
        /\berror\s*[:=]\s*(?!null\b)(?!"")(?!'')\S+/i.test(respuestaStr);

    if (hasErrorKeyWithValue || respuestaStr.includes('failed')) {
        return 'error';
    }
    if (respuestaStr.includes('success') || respuestaStr.includes('"resultado":"ok"') || /\bok\b/.test(respuestaStr)) {
        return 'success';
    }

    return 'warning';
}

export function isOkCommercialRowProcessed(respuesta: unknown): boolean {
    return getOkCommercialRowStatus(respuesta) === 'success';
}
