import { assert, describe, expect, it } from "vitest";
import type { PrezziarioIdprezziario } from "~/schemas/public/Prezziario";
import TipologiaPosizioneEnum from "~/schemas/public/TipologiaPosizioneEnum";
import {
	AccontoSolver,
	SaldoSolver,
} from "~/server/controllers/pagamenti.controller";

type TestInput = {
	tipologia: TipologiaPosizioneEnum;
	permanenza: number | null;
	budget: number;
};

type TestCase = {
	input: TestInput;
	exp_acconto: PrezziarioIdprezziario;
	exp_saldo: PrezziarioIdprezziario;
	descrizione: string;
};

const testCases: TestCase[] = [
	{
		input: {
			tipologia: TipologiaPosizioneEnum.Transitorio,
			permanenza: 0,
			budget: 500,
		},
		exp_acconto: "ACCONTO_BD" as PrezziarioIdprezziario,
		exp_saldo: "SALDOBD_1MESE" as PrezziarioIdprezziario,
		descrizione: "1MESE BD",
	},
	{
		input: {
			tipologia: TipologiaPosizioneEnum.Transitorio,
			permanenza: 1,
			budget: 500,
		},
		exp_acconto: "ACCONTO_BD" as PrezziarioIdprezziario,
		exp_saldo: "SALDOBD_3MESI" as PrezziarioIdprezziario,
		descrizione: "3MESI BD",
	},
	{
		input: {
			tipologia: TipologiaPosizioneEnum.Transitorio,
			permanenza: 2,
			budget: 500,
		},
		exp_acconto: "ACCONTO_BD" as PrezziarioIdprezziario,
		exp_saldo: "SALDOBD_6MESI" as PrezziarioIdprezziario,
		descrizione: "6MESI BD",
	},
	{
		input: {
			tipologia: TipologiaPosizioneEnum.Transitorio,
			permanenza: 3,
			budget: 500,
		},
		exp_acconto: "ACCONTO_BD" as PrezziarioIdprezziario,
		exp_saldo: "SALDOBD_9MESI" as PrezziarioIdprezziario,
		descrizione: "9MESI BD",
	},
	{
		input: {
			tipologia: TipologiaPosizioneEnum.Transitorio,
			permanenza: 4,
			budget: 500,
		},
		exp_acconto: "ACCONTO_BD" as PrezziarioIdprezziario,
		exp_saldo: "SALDOBD_12MESI" as PrezziarioIdprezziario,
		descrizione: "12MESI BD",
	},

	{
		input: {
			tipologia: TipologiaPosizioneEnum.Stabile,
			permanenza: null,
			budget: 500,
		},
		exp_acconto: "ACCONTO_CA" as PrezziarioIdprezziario,
		exp_saldo: "SALDOCA500" as PrezziarioIdprezziario,
		descrizione: "CA 500",
	},
	{
		input: {
			tipologia: TipologiaPosizioneEnum.Stabile,
			permanenza: null,
			budget: 600,
		},
		exp_acconto: "ACCONTO_CA" as PrezziarioIdprezziario,
		exp_saldo: "SALDOCA500+" as PrezziarioIdprezziario,
		descrizione: "CA 500+",
	},
	{
		input: {
			tipologia: TipologiaPosizioneEnum.Stabile,
			permanenza: null,
			budget: 800,
		},
		exp_acconto: "ACCONTO_CA" as PrezziarioIdprezziario,
		exp_saldo: "SALDOCA700+" as PrezziarioIdprezziario,
		descrizione: "CA 700+",
	},
];

describe("Test AccontoSolver", () => {
	it.each(testCases)("$descrizione", async ({ input, exp_acconto }) => {
		const pack = await AccontoSolver(input.tipologia);
		assert(pack.success, "AccontoSolver failed");
		expect(pack.pack.idprezziario).toEqual(exp_acconto);
	});
});

describe("Test SaldoSolver", () => {
	it.each(testCases)("$descrizione", async ({ input, exp_saldo }) => {
		const pack = await SaldoSolver({
			tipologia: input.tipologia,
			permanenza: input.permanenza,
			budget: input.budget,
		});
		assert(pack.success, "SaldoSolver failed");
		expect(pack.pack.idprezziario).toEqual(exp_saldo);
	});
});
