import { For, createMemo, createSignal } from "solid-js";
import { FilledButton } from "../components/FilledButton";
import { FilledCard } from "../components/FilledCard";
import { LoadingIcon } from "../icons/LoadingIcon";
import { MagnifyingGlassIcon } from "../icons/MagnifyingGlassIcon";
import { LoadingStatus, useLoading } from "../utils/functions";

/**
 * Represents the data about the scans that were detected.
 * Serialization & Deserialization is done by the backend.
 */
interface ScanData {
    Ok: Array<[string, ScanResult]>,
}

type ScanResult =
| {Full: [string, number, string]}
| {Partial: [string, string]}
| {Error: string};

function dataFromScanResult(result: ScanResult) {
    if ("Full" in result) {
        return `DNI: ${result.Full[0]}, iid: ${result.Full[1]}`;
    } else if ("Partial" in result) {
        return `DNI: ${result.Partial}`;
    } else if ("Error" in result) {
        return `Error: ${result.Error}`;
    }
}

export function Scans() {
    const {status, setStatus, error, setError} = useLoading();
    const [scanData, setScanData] = createSignal<ScanData | null>(null);

    const loading = createMemo(() => status() === LoadingStatus.Loading);

    const detectScans = () => {
        setStatus(LoadingStatus.Loading);

        fetch(`${import.meta.env.VITE_BACKEND_URL}/api/scans/detect`)
            .then((res) => res.json())
            .then((data) => {
                setStatus(LoadingStatus.Ok);
                setScanData(data);
            })
            .catch((err) => {
                setStatus(LoadingStatus.Error);
                console.error(err);
            });
    };

    return (
        <div class="grid grid-cols-[25rem_25rem_auto]">
            <div>
                <FilledCard>
                    <h1 class="py-2 px-4 font-medium text-xl mb-2">
                        Parámetros de detección
                    </h1>
                    <div class="px-4 pb-4">
                        Para que el sistema detecte y clasifique automáticamente los escaneos
                        se debe cumplir lo siguiente:
                        <ol class="py-2 px-2 list-decimal list-inside">
                            <li>
                                Escanear el certificado en formato&nbsp;
                                <code class="border border-c-outline rounded p-1 bg-c-background">
                                    jpg
                                </code>
                            </li>
                            <li>
                                El nombre del archivo debe iniciar con&nbsp;
                                <code class="border border-c-outline rounded p-1 bg-c-background">
                                    eeg
                                </code>
                            </li>
                            <li>
                                El nombre del archivo debe terminar en&nbsp;
                                <code class="border border-c-outline rounded p-1 bg-c-background">
                                    .jpg
                                </code>
                            </li>
                            <li>
                                El nombre del archivo puede tener otras letras en medio,
                                siempre que se cumplan las condiciones anteriores.
                            </li>
                        </ol>
                        Por ejemplo, los siguientes nombres de archivo son válidos:
                        <ul class="py-2 px-2 list-disc list-inside">
                            <li>
                                <code class="border border-c-outline rounded p-1 bg-c-background">
                                    eeg.jpg
                                </code>
                            </li>
                            <li>
                                <code class="border border-c-outline rounded p-1 bg-c-background">
                                    eeg0001.jpg
                                </code>
                            </li>
                            <li>
                                <code class="border border-c-outline rounded p-1 bg-c-background">
                                    eeg archivo con letras en medio.jpg
                                </code>
                            </li>
                        </ul>
                    </div>
                </FilledCard>

                <FilledCard>
                    <h1 class="py-2 px-4 font-medium text-xl mb-2">
                        Detectar escaneos
                    </h1>
                    <div class="px-4 pb-4">
                        <p>
                            El siguiente botón detectará los archivos
                            que cumplen con los parámetros de detección
                            en la carpeta <code>ESCANEOS</code>, y los mostrará en una lista.
                        </p>
                        <p class="my-2">
                            La detección demora aprox. 1 segundo por cada archivo que
                            cumple con los parámetros.
                        </p>
                        <p class="my-2">
                            Si la detección demora más de 90 segundos, se cancelará.
                        </p>


                        <div class="relative">
                            <FilledButton
                                onClick={detectScans}
                            >
                                <span
                                    class="absolute top-[1.35rem] left-2"
                                    style={{display: loading() ? "none" : "inline-block"}}
                                >
                                    <MagnifyingGlassIcon
                                        fill="var(--c-on-primary)"
                                    />
                                </span>
                                <span
                                    class="absolute top-[1.35rem] left-2"
                                    style={{display: loading() ? "inline-block" : "none"}}
                                >
                                    <LoadingIcon
                                        class="animate-spin"
                                        fill="var(--c-primary-container)"
                                    />
                                </span>

                                <span class="ml-5">
                                    Detectar escaneos
                                </span>
                            </FilledButton>
                        </div>
                    </div>
                </FilledCard>
            </div>
            <div>
                <FilledCard class="border border-c-outline overflow-hidden">
                    <h1 class="p-3 font-medium text-xl">
                        Escaneos detectados
                    </h1>

                    <div class="bg-c-surface py-2">
                        <For each={scanData()?.Ok ?? []}>
                            {([path, result]) => (
                                <p class="py-1 px-4 hover:bg-c-surface-variant transition-colors">
                                    <span class="font-mono">
                                        {path.substring(path.lastIndexOf("/") + 1)}
                                    </span>
                                    <br />
                                    {dataFromScanResult(result)}
                                </p>
                            )}
                        </For>
                    </div>

                    <p class="p-4">
                        Al convertir los escaneos a PDF, se eliminan los archivos JPG.
                        <br />
                        La lista de escaneos a convertir puede haber cambiado desde
                        la última vez que se realizó la detección.
                    </p>
                </FilledCard>
            </div>
        </div>
    );
}
