"""
voucher_entry_dialog.py — Dialog nhập liệu Mua hàng / Bán hàng
"""
import os
import sqlite3
from PySide6.QtWidgets import (
    QDialog, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, 
    QPushButton, QComboBox, QDateEdit, QGridLayout, QGroupBox,
    QMessageBox
)
from PySide6.QtCore import Qt, QDate
from gui.theme import COLORS
from gui.ui_helpers import show_toast

class VoucherEntryDialog(QDialog):
    def __init__(self, voucher_type="HDMV", parent=None):
        super().__init__(parent)
        self.voucher_type = voucher_type # HDMV (Mua), HDXB (Bán)
        self.setWindowTitle("Nhập chứng từ: " + ("Mua hàng" if voucher_type == "HDMV" else "Bán hàng"))
        self.setMinimumWidth(500)
        self._product_data = {} # Khởi tạo tránh lỗi attribute

        
        layout = QVBoxLayout(self)
        
        form = QGroupBox("Thông tin chung")
        grid = QGridLayout(form)
        
        grid.addWidget(QLabel("Số chứng từ:"), 0, 0, 1, 1)
        self.inp_no = QLineEdit()
        grid.addWidget(self.inp_no, 0, 1, 1, 1)
        
        grid.addWidget(QLabel("Ngày:"), 1, 0, 1, 1)
        self.inp_date = QDateEdit(QDate.currentDate())
        self.inp_date.setCalendarPopup(True)
        grid.addWidget(self.inp_date, 1, 1, 1, 1)
        
        grid.addWidget(QLabel("Mô tả:"), 2, 0, 1, 1)
        self.inp_desc = QLineEdit()
        grid.addWidget(self.inp_desc, 2, 1, 1, 1)
        
        layout.addWidget(form)
        
        # Hàng hóa section
        items_box = QGroupBox("Chi tiết hàng hóa")
        items_layout = QGridLayout(items_box)
        
        items_layout.addWidget(QLabel("Sản phẩm:"), 0, 0, 1, 1)
        self.combo_product = QComboBox()
        # Fallback items if DB not loaded
        self.combo_product.addItems(["-- Chọn sản phẩm --"])
        items_layout.addWidget(self.combo_product, 0, 1, 1, 1)
        
        items_layout.addWidget(QLabel("Số lượng:"), 1, 0, 1, 1)
        self.inp_qty = QLineEdit("1")
        items_layout.addWidget(self.inp_qty, 1, 1, 1, 1)
        
        items_layout.addWidget(QLabel("Đơn giá:"), 2, 0, 1, 1)
        self.inp_price = QLineEdit("0")
        items_layout.addWidget(self.inp_price, 2, 1, 1, 1)
        
        layout.addWidget(items_box)
        
        # Buttons
        btns = QHBoxLayout()
        btn_save = QPushButton("Lưu chứng từ")
        btn_save.setObjectName("btn_success")
        btn_save.clicked.connect(self.on_save)
        
        btn_cancel = QPushButton("Hủy")
        btn_cancel.clicked.connect(self.reject)
        
        btns.addStretch()
        btns.addWidget(btn_cancel)
        btns.addWidget(btn_save)
        layout.addLayout(btns)
        
        self.load_products()

    def load_products(self):
        main = self.parent().window() if self.parent() else None
        db_path = getattr(main, "current_db_path", "")
        if db_path and os.path.exists(db_path):
            try:
                conn = sqlite3.connect(db_path)
                c = conn.cursor()
                res = c.execute("SELECT id, code, name FROM products").fetchall()
                self._product_data = {f"{r[1]} - {r[2]}": r[0] for r in res}
                self.combo_product.addItems(self._product_data.keys())
                conn.close()
            except: pass

    def on_save(self):
        main = self.parent().window() if self.parent() else None
        db_path = getattr(main, "current_db_path", "")
        if not db_path or not os.path.exists(db_path):
            QMessageBox.warning(self, "Lỗi", "Chưa chọn database công ty.")
            return

        voucher_no = self.inp_no.text()
        desc = self.inp_desc.text()
        date_str = self.inp_date.date().toString("yyyy-MM-dd")
        qty = float(self.inp_qty.text() or 0)
        price = float(self.inp_price.text() or 0)
        product_text = self.combo_product.currentText()
        product_id = self._product_data.get(product_text)

        if not product_id or qty <= 0:
            QMessageBox.warning(self, "Lỗi", "Vui lòng chọn sản phẩm và nhập số lượng.")
            return

        try:
            from core.licensing import get_trial_status
            
            # 0. Check Trial Limit
            is_pro = getattr(main, "is_activated", False)
            if not is_pro:
                can_add, count = get_trial_status(db_path)
                if not can_add:
                    QMessageBox.warning(self, "Giới hạn dùng thử", 
                        f"Bạn đã sử dụng hết {count} chứng từ dùng thử.\n\n"
                        "Vui lòng kích hoạt bản PRO trong phần 'Cài đặt' để tiếp tục sử dụng không giới hạn.")
                    return

            conn = sqlite3.connect(db_path)
            c = conn.cursor()
            
            # 1. Insert Voucher
            c.execute("""
                INSERT INTO vouchers (voucher_no, voucher_type, voucher_date, period_year, period_month, description, total_debit, total_credit, status)
                VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'posted')
            """, (voucher_no, self.voucher_type, date_str, self.inp_date.date().year(), self.inp_date.date().month(), desc, qty*price, qty*price))
            voucher_id = c.lastrowid
            
            # 2. Insert Journal Entries (Simple Double Entry)
            if self.voucher_type == "HDMV": # Mua: Nợ 156 / Có 331
                acc_dr, acc_cr = "156", "331"
            else: # Bán: Nợ 111 / Có 511
                acc_dr, acc_cr = "111", "511"
                
            c.execute("INSERT INTO journal_entries (voucher_id, line_no, account_code, debit, credit, description) VALUES (?, ?, ?, ?, ?, ?)",
                      (voucher_id, 1, acc_dr, qty*price, 0, desc))
            c.execute("INSERT INTO journal_entries (voucher_id, line_no, account_code, debit, credit, description) VALUES (?, ?, ?, ?, ?, ?)",
                      (voucher_id, 2, acc_cr, 0, qty*price, desc))
            
            # 3. Insert Inventory Movement
            move_type = "in" if self.voucher_type == "HDMV" else "out"
            c.execute("""
                INSERT INTO inventory_movements (product_id, voucher_id, move_date, type, quantity, unit_price, total_value)
                VALUES (?, ?, ?, ?, ?, ?, ?)
            """, (product_id, voucher_id, date_str, move_type, qty, price, qty * price))
            
            conn.commit()
            conn.close()
            
            
            show_toast(self.window(), f"Đã lưu chứng từ {voucher_no} và cập nhật kho.")
            self.accept()
        except Exception as e:
            QMessageBox.critical(self, "Lỗi", f"Không thể lưu: {e}")
