import { CupsOption, FormDataElectrico, FormDataGas } from '../Interfaces/Interfaces';
import { obtenerCodigoCupsElectricoOcupado, obtenerCodigoCupsGasOcupado } from './cupsRowKeys';

export function filtrarCupsElectricosPorCliente(
    cupsElectricos: CupsOption[],
    codCli: number | string | undefined,
): CupsOption[] {
    if (codCli === undefined || codCli === null || codCli === '') {
        return cupsElectricos || [];
    }

    return cupsElectricos.filter((cup: CupsOption) => cup.CodCli === codCli);
}

export function filtrarCupsGasPorCliente(
    cupsGas: any[],
    codCli: number | string | undefined,
): any[] {
    if (codCli === undefined || codCli === null || codCli === '') {
        return cupsGas || [];
    }

    return cupsGas.filter((cup: any) => cup.CodCli === codCli);
}

export function calcularCupsElectricosDisponiblesPorFila(
    dataElectrico: FormDataElectrico[],
    dataGas: FormDataGas[],
    rowIndex: number,
    cupsBase: CupsOption[],
): CupsOption[] {
    const codigosOcupados = [
        ...dataElectrico
            .filter((_, index) => index !== rowIndex)
            .map(obtenerCodigoCupsElectricoOcupado)
            .filter(Boolean),
        ...dataGas.map(obtenerCodigoCupsGasOcupado).filter(Boolean),
    ];

    const codigoActual = obtenerCodigoCupsElectricoOcupado(dataElectrico[rowIndex] ?? ({} as FormDataElectrico));
    const cupsDisponibles = cupsBase.filter((cup) => !codigosOcupados.includes(cup.codigoCups));

    if (codigoActual) {
        const cupsSeleccionado = cupsBase.find((cup) => cup.codigoCups === codigoActual);

        if (cupsSeleccionado && !cupsDisponibles.some((cup) => cup.codigoCups === codigoActual)) {
            cupsDisponibles.push(cupsSeleccionado);
        }
    }

    return cupsDisponibles;
}

export function calcularCupsGasDisponiblesPorFila(
    dataElectrico: FormDataElectrico[],
    dataGas: FormDataGas[],
    rowIndex: number,
    cupsBase: any[],
): any[] {
    const codigosOcupados = [
        ...dataElectrico.map(obtenerCodigoCupsElectricoOcupado).filter(Boolean),
        ...dataGas
            .filter((_, index) => index !== rowIndex)
            .map(obtenerCodigoCupsGasOcupado)
            .filter(Boolean),
    ];

    const codigoActual = obtenerCodigoCupsGasOcupado(dataGas[rowIndex] ?? ({} as FormDataGas));
    const cupsDisponibles = cupsBase.filter((cup: any) => !codigosOcupados.includes(cup.codigoCups));

    if (codigoActual) {
        const cupsSeleccionado = cupsBase.find((cup: any) => cup.codigoCups === codigoActual);

        if (cupsSeleccionado && !cupsDisponibles.some((cup: any) => cup.codigoCups === codigoActual)) {
            cupsDisponibles.push(cupsSeleccionado);
        }
    }

    return cupsDisponibles;
}
