import { fail, redirect } from '@sveltejs/kit';
import type { Actions, PageServerLoad } from './$types';
import {
	KATEGORI_PENDAPATAN_LAIN,
	KATEGORI_PENGELUARAN
} from '$lib/constants/kategori';
import { canCreateTransaksi } from '$lib/server/langganan';
import { createCatatan } from '$lib/server/transaksi';
import type { JenisCatatan } from '$lib/types/transaksi';
import { getTodayDateString, isValidDateString, parseRupiahInput } from '$lib/utils/parse';

export const load: PageServerLoad = async () => ({
	kategoriPengeluaran: KATEGORI_PENGELUARAN,
	kategoriPendapatan: KATEGORI_PENDAPATAN_LAIN,
	tanggalDefault: getTodayDateString()
});

export const actions: Actions = {
	default: async ({ request, locals }) => {
		if (!(await canCreateTransaksi(locals.member!.id))) {
			return fail(403, {
				error: 'Batas transaksi bulan ini sudah tercapai. Upgrade paket untuk melanjutkan.',
				values: {}
			});
		}

		const formData = await request.formData();
		const jenis = String(formData.get('jenis') ?? '') as JenisCatatan;
		const kategori = String(formData.get('kategori') ?? '').trim();
		const deskripsi = String(formData.get('deskripsi') ?? '').trim();
		const jumlahRaw = String(formData.get('jumlah') ?? '');
		const tanggal = String(formData.get('tanggal') ?? '').trim();
		const jumlah = parseRupiahInput(jumlahRaw);

		const values = { jenis, kategori, deskripsi, jumlah: jumlahRaw, tanggal };

		if (jenis !== 'pendapatan' && jenis !== 'pengeluaran') {
			return fail(400, { error: 'Jenis transaksi tidak valid.', values });
		}

		const validKategori =
			jenis === 'pengeluaran'
				? KATEGORI_PENGELUARAN.some((k) => k.value === kategori)
				: KATEGORI_PENDAPATAN_LAIN.some((k) => k.value === kategori);

		if (!validKategori) return fail(400, { error: 'Pilih kategori yang valid.', values });
		if (!deskripsi) return fail(400, { error: 'Deskripsi wajib diisi.', values });
		if (jumlah <= 0) return fail(400, { error: 'Jumlah harus lebih dari Rp 0.', values });
		if (!isValidDateString(tanggal)) return fail(400, { error: 'Tanggal tidak valid.', values });
		if (tanggal > getTodayDateString()) {
			return fail(400, { error: 'Tanggal tidak boleh di masa depan.', values });
		}

		try {
			await createCatatan({
				memberId: locals.member!.id,
				jenis,
				kategori,
				deskripsi,
				jumlah,
				tanggal
			});
		} catch {
			return fail(500, {
				error: 'Gagal menyimpan ke database. Pastikan MySQL berjalan dan jalankan npm run db:init.',
				values: { jenis, kategori, deskripsi, jumlah: jumlahRaw, tanggal }
			});
		}

		throw redirect(303, '/transaksi/catatan?success=1');
	}
};
