import sqlite3
import tempfile
import unittest
from pathlib import Path

from pypos.modules.penjualan.models.transaksi_model import TransaksiModel


def _seed_schema(db_path: str):
    conn = sqlite3.connect(db_path)
    cur = conn.cursor()
    cur.execute(
        """
        CREATE TABLE produk (
            id INTEGER PRIMARY KEY,
            nama TEXT,
            barcode TEXT,
            hpp REAL,
            satuan TEXT
        )
        """
    )
    cur.execute(
        """
        CREATE TABLE price (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            produk_id INTEGER,
            jenis_value TEXT,
            nilai REAL,
            status INTEGER,
            trash INTEGER,
            cabang_id INTEGER
        )
        """
    )
    cur.execute(
        """
        CREATE TABLE diskon (
            id INTEGER PRIMARY KEY,
            produk_id INTEGER,
            jenis TEXT,
            minim INTEGER,
            maxim INTEGER,
            harga REAL,
            nilai REAL,
            persen REAL,
            status INTEGER,
            trash INTEGER,
            cabang_id INTEGER,
            dtime_start TEXT,
            dtime_end TEXT,
            free_produk_id INTEGER,
            free_produk_nama TEXT,
            kelipatan INTEGER
        )
        """
    )
    conn.commit()
    conn.close()


# edited by glg
class TransaksiModelPricingGrosirTests(unittest.TestCase):
    def test_qty_satu_tetap_harga_list_dan_tier_anomali_fallback_ke_nilai(self):
        with tempfile.TemporaryDirectory(ignore_cleanup_errors=True) as td:
            db_path = str(Path(td) / "harga_grosir_anomali.db")
            _seed_schema(db_path)

            conn = sqlite3.connect(db_path)
            cur = conn.cursor()
            cur.execute(
                "INSERT INTO produk (id, nama, barcode, hpp, satuan) VALUES (?, ?, ?, ?, ?)",
                (9201, "ecr Nabati Richeese", "8993175535878", 0, "pcs"),
            )
            cur.execute(
                """
                INSERT INTO price (produk_id, jenis_value, nilai, status, trash, cabang_id)
                VALUES (?, 'harga_list', ?, 1, 0, -1)
                """,
                (9201, 1900),
            )
            cur.executemany(
                """
                INSERT INTO diskon
                (id, produk_id, jenis, minim, maxim, harga, nilai, persen, status, trash, cabang_id, dtime_start, dtime_end, free_produk_id, free_produk_nama, kelipatan)
                VALUES (?, ?, 'produk_grosir', ?, ?, ?, ?, ?, 1, 0, -1, NULL, NULL, NULL, NULL, NULL)
                """,
                [
                    (1, 9201, 10, 39, 1850, 50, 2.631578947368421),
                    (2, 9201, 40, 79, 1800, 100, 5.263157894736842),
                    (3, 9201, 80, 0, 72000, 200, 10.526315789473683),
                ],
            )
            conn.commit()
            conn.close()

            model = TransaksiModel(db_path)

            qty_1 = model.cari_barang_by_id(9201, 1)
            self.assertEqual(float(qty_1["harga"]), 1900.0)
            self.assertEqual(float(qty_1["diskon_persen"]), 0.0)

            qty_80 = model.cari_barang_by_id(9201, 80)
            self.assertEqual(float(qty_80["harga"]), 1900.0)
            self.assertAlmostEqual(float(qty_80["diskon_persen"]), 10.5263157894, places=3)


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