import type { ChangeEvent } from "react";
import type { z } from "zod/v4";
import type { Comuni } from "~/schemas/public/Comuni";
import type { Nazioni } from "~/schemas/public/Nazioni";
import { ITALY_CATASTO_CODE } from "./catasto";
import { CalcolaCodiceFiscale } from "./codice_fiscale";

export const NullableStringOnChange = (
	e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>,
	// biome-ignore lint/suspicious/noExplicitAny: <intended>
	fn: (...event: any[]) => void,
) => {
	fn(e.target.value && e.target.value !== "" ? e.target.value : null);
};

export const checkFiscalCodeValidity = ({
	path,
	codiceFiscale,
	cognome,
	nome,
	dataNascita,
	sesso,
	refinementContext,
	luogoNascita,
	nazioneNascita,
	comuneCatasto,
	nazioneCatasto,
}: {
	path: string;
	codiceFiscale: string;
	cognome: string;
	nome: string;
	dataNascita: Date;
	sesso: string;
	refinementContext: z.RefinementCtx;
	luogoNascita: string;
	nazioneNascita: string;
	comuneCatasto: Comuni | undefined;
	nazioneCatasto: Nazioni | undefined;
}) => {
	const cognomeUpper = cognome.toUpperCase();
	const nomeUpper = nome.toUpperCase();

	let codiceCatasto = "";
	if (nazioneNascita === ITALY_CATASTO_CODE) {
		if (luogoNascita !== "") {
			if (comuneCatasto) {
				codiceCatasto = comuneCatasto.catasto;
			}
		}
	} else {
		if (nazioneNascita !== "") {
			if (nazioneCatasto) {
				codiceCatasto = nazioneCatasto.catasto;
			}
		}
	}
	if (sesso !== "M" && sesso !== "F") {
		throw new Error("Invalid sex for CF generation");
	}

	const { cf, omocodie } = CalcolaCodiceFiscale({
		cognome: cognomeUpper,
		dataNascita,
		catasto: codiceCatasto,
		nome: nomeUpper,
		sesso,
	});

	if (
		codiceFiscale.slice(0, 15) !== cf.slice(0, 15) &&
		!(codiceFiscale in omocodie)
	) {
		refinementContext.issues.push({
			code: "custom",
			input: "",
			message: "Codice fiscale non valido",
			path: [path],
		});
	}

	if (codiceFiscale.slice(-1) !== cf.slice(-1)) {
		refinementContext.issues.push({
			code: "custom",
			input: "",
			message: "Codice di controllo non valido",
			path: [path],
		});
	}

	if (codiceFiscale.length !== 16) {
		refinementContext.issues.push({
			code: "custom",
			input: "",
			message: "Inserisci un codice fiscale valido",
			path: [path],
		});
	}
	if (
		!/^(?:[A-Z][AEIOU][AEIOUX]|[AEIOU]X{2}|[B-DF-HJ-NP-TV-Z]{2}[A-Z]){2}(?:[\dLMNP-V]{2}(?:[A-EHLMPR-T](?:[04LQ][1-9MNP-V]|[15MR][\dLMNP-V]|[26NS][0-8LMNP-U])|[DHPS][37PT][0L]|[ACELMRT][37PT][01LM]|[AC-EHLMPR-T][26NS][9V])|(?:[02468LNQSU][048LQU]|[13579MPRTV][26NS])B[26NS][9V])(?:[A-MZ][1-9MNP-V][\dLMNP-V]{2}|[A-M][0L](?:[1-9MNP-V][\dLMNP-V]|[0L][1-9MNP-V]))[A-Z]$/i.exec(
			codiceFiscale,
		)
	) {
		refinementContext.issues.push({
			code: "custom",
			input: "",
			message: `Inserisci un codice fiscale valido: received ${codiceFiscale}`,
			path: [path],
		});
	}

	if (codiceFiscale.slice(0, 3) !== cf.slice(0, 3)) {
		refinementContext.issues.push({
			code: "custom",
			input: "",
			message: "Codice fiscale incompatibile con cognome inserito",
			path: [path],
		});
	}
	if (codiceFiscale.slice(3, 6) !== cf.slice(3, 6)) {
		refinementContext.issues.push({
			code: "custom",
			input: "",
			message: "Codice fiscale incompatibile con nome inserito",
			path: [path],
		});
	}

	if (codiceFiscale.slice(6, 8) !== cf.slice(6, 8)) {
		refinementContext.issues.push({
			code: "custom",
			input: "",
			message: "Codice fiscale incompatibile con anno di nascita",
			path: [path],
		});
	}

	if (codiceFiscale.slice(8, 9) !== cf.slice(8, 9)) {
		refinementContext.issues.push({
			code: "custom",
			input: "",
			message: "Codice fiscale incompatibile con mese di nascita",
			path: [path],
		});
	}
	if (codiceFiscale.slice(9, 11) !== cf.slice(9, 11)) {
		refinementContext.issues.push({
			code: "custom",
			input: "",
			message: "Codice fiscale incompatibile con giorno di nascita",
			path: [path],
		});
	}

	if (nazioneNascita === ITALY_CATASTO_CODE) {
		if (luogoNascita !== "") {
			if (
				comuneCatasto &&
				codiceFiscale.slice(11, 15) !== comuneCatasto.catasto
			) {
				refinementContext.issues.push({
					code: "custom",
					input: "",
					message: "Codice fiscale incompatibile con luogo di nascita",
					path: [path],
				});
			}
		}
	} else {
		if (nazioneNascita !== "") {
			if (
				nazioneCatasto &&
				codiceFiscale.slice(11, 15) !== nazioneCatasto.catasto
			) {
				refinementContext.issues.push({
					code: "custom",
					input: "",
					message: "Codice fiscale incompatibile con luogo di nascita",
					path: [path],
				});
			}
		}
	}
};
