import { fail } from '@sveltejs/kit';
import type { Actions, PageServerLoad } from './$types';
import type { FilterStok, JenisMutasi } from '$lib/types/stok';
import { deleteBarang, getStokList, mutasiStok } from '$lib/server/stok';
import { getTodayDateString, isValidDateString } from '$lib/utils/parse';

function parseFilter(value: string | null): FilterStok {
	if (value === 'menipis' || value === 'habis' || value === 'aktif') return value;
	return 'semua';
}

export const load: PageServerLoad = async ({ url, locals }) => {
	const filter = parseFilter(url.searchParams.get('filter'));
	const kategori = url.searchParams.get('kategori')?.trim() ?? '';
	const success = url.searchParams.get('success') === '1';
	const data = await getStokList(locals.member!.id, filter, kategori);

	return { ...data, success };
};

export const actions: Actions = {
	mutasi: async ({ request, locals }) => {
		const formData = await request.formData();
		const barangId = Number(formData.get('barang_id'));
		const jenis = String(formData.get('jenis') ?? '') as JenisMutasi;
		const jumlah = Number(formData.get('jumlah'));
		const keterangan = String(formData.get('keterangan') ?? '').trim();
		const tanggal = String(formData.get('tanggal') ?? '').trim() || getTodayDateString();

		if (!barangId) return fail(400, { mutasiError: 'Barang tidak valid.' });
		if (jenis !== 'masuk' && jenis !== 'keluar' && jenis !== 'penyesuaian') {
			return fail(400, { mutasiError: 'Jenis mutasi tidak valid.' });
		}
		if (!Number.isInteger(jumlah) || jumlah <= 0) {
			return fail(400, { mutasiError: 'Jumlah harus bilangan bulat lebih dari 0.' });
		}
		if (!isValidDateString(tanggal)) {
			return fail(400, { mutasiError: 'Tanggal tidak valid.' });
		}

		try {
			const ok = await mutasiStok({
				memberId: locals.member!.id,
				barangId,
				jenis,
				jumlah,
				keterangan,
				tanggal
			});

			if (!ok) {
				return fail(400, {
					mutasiError:
						jenis === 'keluar'
							? 'Stok tidak cukup untuk dikurangi.'
							: 'Gagal memproses mutasi stok.'
				});
			}
		} catch {
			return fail(500, {
				mutasiError: 'Gagal menyimpan mutasi. Pastikan MySQL berjalan dan jalankan npm run db:init.'
			});
		}

		return { mutasiSuccess: true };
	},
	hapus: async ({ request, locals }) => {
		const id = Number((await request.formData()).get('id'));
		if (!id) return fail(400, { error: 'Data tidak valid.' });

		const ok = await deleteBarang(locals.member!.id, id);
		if (!ok) return fail(404, { error: 'Barang tidak ditemukan.' });

		return { deleted: true };
	}
};
