from pypos.core.base_model import BaseModel
from pypos.core.utils.db_helper import connect_sqlite
from pypos.core.utils.path_utils import get_db_path

class DashboardInfoModel(BaseModel):
    def __init__(self, db_path=None):
        super().__init__()
        self.db_path = db_path or get_db_path()

    def get_today_summary(self):
        conn = connect_sqlite(self.db_path, timeout=30)
        try:
            # edited by glg
            # Query ringkasan dashboard bersifat periodik UI;
            # gunakan busy timeout pendek agar tidak menunggu lock terlalu lama.
            conn.execute("PRAGMA busy_timeout=250")
        except (TypeError, ValueError, KeyError, AttributeError, RuntimeError, OSError, LookupError, ArithmeticError, ImportError):
            pass
        try:
            cursor = conn.cursor()
            # edited by glg
            # Gunakan range dtime agar query harian tetap index-friendly pada data besar.
            cursor.execute("""
                SELECT COUNT(*), COALESCE(SUM(transaksi_nilai), 0)
                FROM transaksi
                WHERE dtime >= datetime('now', 'localtime', 'start of day')
                  AND dtime < datetime('now', 'localtime', 'start of day', '+1 day')
                  AND jenis_label = 'invoice'
            """)
            transaksi_result = cursor.fetchone() or (0, 0)
            transaksi_count, transaksi_total = transaksi_result

            # edited by glg
            # Hindari DATE(tanggal_return) untuk mencegah full-scan saat tabel return bertambah.
            cursor.execute("""
                SELECT COUNT(*), COALESCE(SUM(total_return), 0)
                FROM return_transaksi_penjualan
                WHERE tanggal_return >= datetime('now', 'localtime', 'start of day')
                  AND tanggal_return < datetime('now', 'localtime', 'start of day', '+1 day')
            """)
            retur_result = cursor.fetchone() or (0, 0)
            retur_count, retur_total = retur_result
            return transaksi_count, transaksi_total, retur_count, retur_total
        finally:
            conn.close()
