﻿from pypos.modules.penjualan.models.barang_model import BarangModel


class BarangService:
    def __init__(self, model=None):
        self.model = model or BarangModel()

    def _parse_int_field(self, value, field_label):
        text = str(value or "").strip()
        if text == "":
            raise ValueError(f"{field_label} wajib diisi.")
        try:
            return int(text)
        except (TypeError, ValueError):
            raise ValueError(f"{field_label} harus berupa angka bulat.")

    def get_page(self, current_page, rows_per_page, search_term=None):
        current_page = max(0, int(current_page or 0))
        rows_per_page = max(1, int(rows_per_page or 1))
        total = self.model.get_total_count(search_term)
        offset = current_page * rows_per_page
        if offset >= total and total > 0:
            current_page = max(0, current_page - 1)
            offset = current_page * rows_per_page
        rows = self.model.get_barang_paginated(offset, rows_per_page, search_term)
        return {
            "rows": rows,
            "total": total,
            "page": current_page,
            "offset": offset,
        }

    def get_barang_by_id(self, produk_id):
        return self.model.get_barang_by_id(produk_id)

    def delete_barang(self, produk_id):
        self.model.delete_barang(produk_id)

    def save_barang(self, current_edit_id, nama, hpp, harga_jual, deskripsi, diskon):
        if not all([nama, hpp, harga_jual, deskripsi]):
            raise ValueError("Semua field harus diisi.")

        hpp_value = self._parse_int_field(hpp, "Harga Pokok")
        harga_jual_value = self._parse_int_field(harga_jual, "Harga Jual")
        diskon_value = self._parse_int_field(diskon or "0", "Diskon")

        if current_edit_id:
            self.model.update_barang(
                current_edit_id,
                nama,
                hpp_value,
                harga_jual_value,
                deskripsi,
                diskon_value,
            )
            return {
                "mode": "update",
                "message": "Barang berhasil diperbarui.",
                "next_edit_id": None,
            }

        self.model.insert_barang(nama, hpp_value, harga_jual_value, deskripsi, diskon_value)
        return {
            "mode": "insert",
            "message": "Barang berhasil ditambahkan.",
            "next_edit_id": None,
        }
