from pypos.core.base_controller import BaseController
from pypos.modules.customer.config.customer_config import (
    get_customer_config,
    get_customer_setup_page_size,
)
from pypos.modules.customer.services.customer_service import CustomerService


class CustomerSetupController(BaseController):
    def __init__(self, view, service=None):
        super().__init__()
        self.view = view
        self.service = service or CustomerService()
        self.config = get_customer_config()
        self.current_page = 0
        self.items_per_page = get_customer_setup_page_size(self.config)
        self.editing_id = None
        self.current_keyword = ""
        self.total_data = 0

    def initialize(self):
        self.reload_page(reset_page=True)

    def on_submit(self):
        nama, alamat, telepon = self.view.get_form_values()
        try:
            if self.editing_id:
                self.service.update_customer(self.editing_id, nama, alamat, telepon)
                self.show_info("Sukses", "Data customer diperbarui.", view=self.view)
            else:
                self.service.add_customer(nama, alamat, telepon)
                self.show_info("Sukses", "Customer ditambahkan.", view=self.view)
        except ValueError as exc:
            self.show_warning("Validasi", str(exc), view=self.view)
            return
        except (TypeError, ValueError, KeyError, AttributeError, RuntimeError, OSError, LookupError, ArithmeticError, ImportError) as exc:
            self.show_error("Customer", f"Gagal menyimpan data customer: {exc}", view=self.view)
            return

        self.editing_id = None
        self.view.set_submit_button_label("Tambah Customer")
        self.view.reset_form()
        self.reload_page(reset_page=False)

    def on_search(self):
        self.current_keyword = self.view.get_search_keyword()
        self.reload_page(reset_page=True)

    def go_next_page(self):
        max_offset = self.current_page * self.items_per_page + self.items_per_page
        if max_offset >= self.total_data:
            return
        self.current_page += 1
        self.reload_page(reset_page=False)

    def go_prev_page(self):
        if self.current_page <= 0:
            return
        self.current_page -= 1
        self.reload_page(reset_page=False)

    def start_edit(self, customer_id):
        try:
            customer = self.service.get_customer_by_id(customer_id)
        except (TypeError, ValueError, KeyError, AttributeError, RuntimeError, OSError, LookupError, ArithmeticError, ImportError) as exc:
            self.show_error("Customer", f"Gagal memuat data customer: {exc}", view=self.view)
            return
        if not customer:
            self.show_warning("Customer", "Data customer tidak ditemukan.", view=self.view)
            return
        self.editing_id = int(customer[0])
        self.view.set_form_values(customer[1], customer[2], customer[3])
        self.view.set_submit_button_label("Simpan Perubahan")

    def delete_customer(self, customer_id):
        confirmed = self.ask_confirm(
            "Konfirmasi",
            "Yakin ingin menghapus customer ini?",
            view=self.view,
            yes_label="Hapus",
            no_label="Batal",
            default_no=True,
        )
        if not confirmed:
            return
        try:
            self.service.delete_customer(customer_id)
        except (TypeError, ValueError, KeyError, AttributeError, RuntimeError, OSError, LookupError, ArithmeticError, ImportError) as exc:
            self.show_error("Customer", f"Gagal menghapus customer: {exc}", view=self.view)
            return
        self.show_info("Sukses", "Customer berhasil dihapus.", view=self.view)
        self.reload_page(reset_page=False)

    def reload_page(self, reset_page=False):
        if reset_page:
            self.current_page = 0
        self.current_keyword = self.view.get_search_keyword() if reset_page else self.current_keyword
        self.total_data = self.service.count_customers(self.current_keyword)
        if self.total_data == 0:
            self.current_page = 0
        offset = self.current_page * self.items_per_page
        if self.total_data > 0 and offset >= self.total_data:
            self.current_page = max(0, (self.total_data - 1) // self.items_per_page)
            offset = self.current_page * self.items_per_page
        rows = self.service.get_customers_paged(
            search_term=self.current_keyword,
            limit=self.items_per_page,
            offset=offset,
        )
        self.view.render_customer_rows(rows, self.start_edit, self.delete_customer)
        self.view.update_pagination_state(
            current_page=self.current_page,
            items_per_page=self.items_per_page,
            total_data=self.total_data,
        )
