import { fail, redirect } from '@sveltejs/kit';
import type { Actions, PageServerLoad } from './$types';
import { KATEGORI_BARANG } from '$lib/constants/kategori-barang';
import { canAddBarang } from '$lib/server/langganan';
import { createBarang } from '$lib/server/stok';
import { parseRupiahInput } from '$lib/utils/parse';

export const load: PageServerLoad = async () => ({
	kategori: KATEGORI_BARANG
});

export const actions: Actions = {
	default: async ({ request, locals }) => {
		const formData = await request.formData();
		const nama = String(formData.get('nama') ?? '').trim();
		const kategori = String(formData.get('kategori') ?? '').trim();
		const satuan = String(formData.get('satuan') ?? 'pcs').trim();
		const hargaBeliRaw = String(formData.get('harga_beli') ?? '').trim();
		const hargaJualRaw = String(formData.get('harga_jual') ?? '').trim();
		const stok = Number(formData.get('stok'));
		const stokMinimum = Number(formData.get('stok_minimum'));
		const deskripsi = String(formData.get('deskripsi') ?? '').trim();

		const values = {
			nama,
			kategori,
			satuan,
			harga_beli: hargaBeliRaw,
			harga_jual: hargaJualRaw,
			stok: String(stok),
			stok_minimum: String(stokMinimum),
			deskripsi
		};

		const hargaBeli = hargaBeliRaw ? parseRupiahInput(hargaBeliRaw) : null;
		const hargaJual = hargaJualRaw ? parseRupiahInput(hargaJualRaw) : null;

		if (!nama) return fail(400, { error: 'Nama barang wajib diisi.', values });
		if (!kategori) return fail(400, { error: 'Kategori wajib dipilih.', values });
		if (!Number.isInteger(stok) || stok < 0) {
			return fail(400, { error: 'Stok awal harus bilangan bulat 0 atau lebih.', values });
		}
		if (!Number.isInteger(stokMinimum) || stokMinimum < 0) {
			return fail(400, { error: 'Stok minimum harus bilangan bulat 0 atau lebih.', values });
		}

		if (!(await canAddBarang(locals.member!.id))) {
			return fail(403, {
				error: 'Batas jumlah barang paket Anda sudah tercapai. Upgrade paket untuk menambah produk.',
				values
			});
		}

		try {
			await createBarang({
				memberId: locals.member!.id,
				nama,
				kategori,
				satuan,
				hargaBeli,
				hargaJual,
				stok,
				stokMinimum,
				deskripsi
			});
		} catch {
			return fail(500, {
				error: 'Gagal menyimpan ke database. Pastikan MySQL berjalan dan jalankan npm run db:init.',
				values
			});
		}

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