# edited by glg
import sqlite3
import tempfile
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,
            status INTEGER DEFAULT 1,
            trash INTEGER DEFAULT 0
        )
        """
    )
    cur.execute(
        """
        CREATE TABLE price (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            produk_id INTEGER,
            jenis_value TEXT,
            nilai REAL,
            status INTEGER DEFAULT 1,
            trash INTEGER DEFAULT 0,
            cabang_id INTEGER DEFAULT -1
        )
        """
    )
    conn.commit()
    conn.close()


def test_lookup_barcode_hanya_produk_dengan_harga_aktif():
    with tempfile.TemporaryDirectory(ignore_cleanup_errors=True) as td:
        db_path = str(Path(td) / "lookup_price_guard_barcode.db")
        _seed_schema(db_path)

        conn = sqlite3.connect(db_path)
        cur = conn.cursor()
        cur.executemany(
            "INSERT INTO produk (id, nama, barcode, hpp, satuan, status, trash) VALUES (?, ?, ?, ?, ?, 1, 0)",
            [
                (1, "Produk Harga Valid", "8990000000001", 0, "pcs"),
                (2, "Produk Tanpa Harga", "8990000000002", 0, "pcs"),
                (3, "Produk Harga Nol", "8990000000003", 0, "pcs"),
            ],
        )
        cur.executemany(
            "INSERT INTO price (produk_id, jenis_value, nilai, status, trash, cabang_id) VALUES (?, 'harga_list', ?, 1, 0, -1)",
            [
                (1, 3500),
                (3, 0),
            ],
        )
        conn.commit()
        conn.close()

        model = TransaksiModel(db_path)
        model._lookup_require_active_harga = True

        assert model.cari_barang_by_barcode("8990000000001")["id"] == 1
        assert model.cari_barang_by_barcode("8990000000002") is None
        assert model.cari_barang_by_barcode("8990000000003") is None
        assert model.cari_barang_by_barcode_raw("8990000000002")["id"] == 2
        assert model.cari_barang_by_barcode_raw("8990000000003")["id"] == 3


def test_lookup_nama_dan_autocomplete_hanya_produk_dengan_harga_aktif():
    with tempfile.TemporaryDirectory(ignore_cleanup_errors=True) as td:
        db_path = str(Path(td) / "lookup_price_guard_nama.db")
        _seed_schema(db_path)

        conn = sqlite3.connect(db_path)
        cur = conn.cursor()
        cur.executemany(
            "INSERT INTO produk (id, nama, barcode, hpp, satuan, status, trash) VALUES (?, ?, ?, ?, ?, 1, 0)",
            [
                (11, "Abon Valid", "10001", 0, "pcs"),
                (12, "Abon Tanpa Harga", "10002", 0, "pcs"),
                (13, "Abon Harga Nol", "10003", 0, "pcs"),
            ],
        )
        cur.executemany(
            "INSERT INTO price (produk_id, jenis_value, nilai, status, trash, cabang_id) VALUES (?, 'harga_list', ?, 1, 0, -1)",
            [
                (11, 12000),
                (13, 0),
            ],
        )
        conn.commit()
        conn.close()

        model = TransaksiModel(db_path)
        model._lookup_require_active_harga = True

        assert model.cari_barang_by_nama("Abon Valid")["id"] == 11
        assert model.cari_barang_by_nama("Abon Tanpa Harga") is None
        assert model.cari_barang_by_nama("Abon Harga Nol") is None
        assert model.cari_barang_by_nama_raw("Abon Tanpa Harga")["id"] == 12
        assert model.cari_barang_by_nama_raw("Abon Harga Nol")["id"] == 13

        items, mapping = model.get_produk_autocomplete("Abon", limit=10)
        assert items, "Autocomplete minimal harus berisi produk valid."
        ids = {int(payload["id"]) for payload in mapping.values()}
        assert ids == {11}
