import sqlite3
import tempfile
import unittest
from datetime import datetime
from pathlib import Path

from pypos.modules.penjualan.models.diskon_customer_model import DiskonCustomerModel


def _seed_diskon_customer_schema(db_path: str):
    conn = sqlite3.connect(db_path)
    cur = conn.cursor()
    cur.execute(
        """
        CREATE TABLE IF NOT EXISTS diskon_customer (
            id INTEGER PRIMARY KEY,
            status INTEGER,
            trash INTEGER,
            cabang_id INTEGER,
            customer_id INTEGER,
            customer_level INTEGER,
            minim REAL,
            maxim REAL,
            tanggal_start TEXT,
            tanggal_stop TEXT,
            jam_start TEXT,
            jam_stop TEXT,
            quota_global INTEGER,
            quota_per_customer INTEGER,
            periode TEXT,
            tipe TEXT,
            jenis TEXT,
            persen REAL,
            nilai REAL
        )
        """
    )
    cur.execute(
        """
        CREATE TABLE IF NOT EXISTS transaksi (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            customers_id INTEGER,
            diskon_log TEXT,
            trash INTEGER DEFAULT 0,
            jenis_label TEXT,
            dtime TEXT
        )
        """
    )
    conn.commit()
    conn.close()


class DiskonCustomerModelTestCase(unittest.TestCase):
    def test_diskon_customer_applies_when_quota_available(self):
        with tempfile.TemporaryDirectory() as td:
            db_path = str(Path(td) / "diskon_customer_available.db")
            _seed_diskon_customer_schema(db_path)
            model = DiskonCustomerModel(db_path)
            model.get_customer_level_id = lambda customer_id: 2
            model.get_active_cabang_id = lambda: 10

            conn = sqlite3.connect(db_path)
            cur = conn.cursor()
            cur.execute(
                """
                INSERT INTO diskon_customer
                (id, status, trash, cabang_id, customer_id, customer_level, minim, maxim, tanggal_start, tanggal_stop, jam_start, jam_stop, quota_global, quota_per_customer, periode, tipe, jenis, persen, nilai)
                VALUES (?, 1, 0, ?, ?, 0, 0, 0, ?, ?, '00:00:00', '23:59:59', 2, 1, 'harian', 'diskon', 'transaksi', 10, 0)
                """,
                (
                    101,
                    10,
                    123,
                    datetime.now().strftime("%Y-%m-%d"),
                    datetime.now().strftime("%Y-%m-%d"),
                ),
            )
            conn.commit()
            conn.close()

            result = model.calculate_benefits(200000, 123)
            self.assertEqual(float(result["diskon_nilai"]), 20000.0)
            self.assertIn(101, result["applied_rule_ids"])

    def test_diskon_customer_blocked_when_quota_exhausted(self):
        with tempfile.TemporaryDirectory() as td:
            db_path = str(Path(td) / "diskon_customer_quota.db")
            _seed_diskon_customer_schema(db_path)
            model = DiskonCustomerModel(db_path)
            model.get_customer_level_id = lambda customer_id: 2
            model.get_active_cabang_id = lambda: 10

            today = datetime.now().strftime("%Y-%m-%d")
            now_ts = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

            conn = sqlite3.connect(db_path)
            cur = conn.cursor()
            cur.execute(
                """
                INSERT INTO diskon_customer
                (id, status, trash, cabang_id, customer_id, customer_level, minim, maxim, tanggal_start, tanggal_stop, jam_start, jam_stop, quota_global, quota_per_customer, periode, tipe, jenis, persen, nilai)
                VALUES (?, 1, 0, ?, ?, 0, 0, 0, ?, ?, '00:00:00', '23:59:59', 1, 1, 'harian', 'diskon', 'transaksi', 15, 0)
                """,
                (202, 10, 123, today, today),
            )
            cur.execute(
                """
                INSERT INTO transaksi (customers_id, diskon_log, trash, jenis_label, dtime)
                VALUES (?, ?, 0, 'invoice', ?)
                """,
                (123, "rule_id=202", now_ts),
            )
            conn.commit()
            conn.close()

            result = model.calculate_benefits(200000, 123)
            self.assertEqual(float(result["diskon_nilai"]), 0.0)
            self.assertEqual(result["applied_rule_ids"], [])


if __name__ == "__main__":
    unittest.main()
