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

export const load: PageServerLoad = async ({ params, locals }) => {
	const id = Number(params.id);
	if (!id) throw error(404, 'Barang tidak ditemukan');

	const barang = await getBarangById(locals.member!.id, id);
	if (!barang) throw error(404, 'Barang tidak ditemukan');

	return {
		barang,
		kategori: KATEGORI_BARANG
	};
};

export const actions: Actions = {
	default: async ({ request, locals, params }) => {
		const id = Number(params.id);
		if (!id) return fail(400, { error: 'Barang tidak valid.' });

		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 stokMinimum = Number(formData.get('stok_minimum'));
		const deskripsi = String(formData.get('deskripsi') ?? '').trim();
		const isAktif = formData.get('is_aktif') === '1';

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

		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(stokMinimum) || stokMinimum < 0) {
			return fail(400, { error: 'Stok minimum harus bilangan bulat 0 atau lebih.', values });
		}

		try {
			const ok = await updateBarang({
				memberId: locals.member!.id,
				id,
				nama,
				kategori,
				satuan,
				hargaBeli,
				hargaJual,
				stokMinimum,
				deskripsi,
				isAktif
			});

			if (!ok) return fail(404, { error: 'Barang tidak ditemukan.', values });
		} catch {
			return fail(500, {
				error: 'Gagal memperbarui data. Pastikan MySQL berjalan.',
				values
			});
		}

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