# edited by glg
import sqlite3
import tempfile
from pathlib import Path

from pypos.modules.customer.models.customer_model import CustomerModel


def _seed_customer_table(db_path: str, include_status_trash: bool = True):
    conn = sqlite3.connect(db_path)
    cur = conn.cursor()
    if include_status_trash:
        cur.execute(
            """
            CREATE TABLE IF NOT EXISTS per_customers (
                id INTEGER PRIMARY KEY,
                nama TEXT,
                alamat_1 TEXT,
                tlp_1 TEXT,
                status INTEGER DEFAULT 1,
                trash INTEGER DEFAULT 0
            )
            """
        )
    else:
        cur.execute(
            """
            CREATE TABLE IF NOT EXISTS per_customers (
                id INTEGER PRIMARY KEY,
                nama TEXT,
                alamat_1 TEXT,
                tlp_1 TEXT
            )
            """
        )
    conn.commit()
    conn.close()


def _build_model(db_path: str):
    model = CustomerModel()
    model.db_path = str(db_path)
    return model


def test_customer_model_filters_only_active_records_when_status_columns_exist():
    with tempfile.TemporaryDirectory() as td:
        db_path = str(Path(td) / "customer_model_active.db")
        _seed_customer_table(db_path, include_status_trash=True)
        model = _build_model(db_path)

        conn = sqlite3.connect(db_path)
        cur = conn.cursor()
        cur.execute(
            """
            INSERT INTO per_customers (id, nama, alamat_1, tlp_1, status, trash)
            VALUES (1, 'Aktif', 'Jl A', '081', 1, 0)
            """
        )
        cur.execute(
            """
            INSERT INTO per_customers (id, nama, alamat_1, tlp_1, status, trash)
            VALUES (2, 'Nonaktif', 'Jl B', '082', 0, 0)
            """
        )
        cur.execute(
            """
            INSERT INTO per_customers (id, nama, alamat_1, tlp_1, status, trash)
            VALUES (3, 'Terhapus', 'Jl C', '083', 1, 1)
            """
        )
        conn.commit()
        conn.close()

        assert model.count_customers() == 1
        rows = model.get_customers()
        assert len(rows) == 1
        assert str(rows[0][1]) == "Aktif"


def test_customer_model_add_customer_sets_status_active_when_columns_exist():
    with tempfile.TemporaryDirectory() as td:
        db_path = str(Path(td) / "customer_model_add_status.db")
        _seed_customer_table(db_path, include_status_trash=True)
        model = _build_model(db_path)

        model.add_customer("Baru", "Jl Baru", "08123")

        conn = sqlite3.connect(db_path)
        cur = conn.cursor()
        cur.execute(
            """
            SELECT nama, alamat_1, tlp_1, status, trash
            FROM per_customers
            ORDER BY id ASC
            LIMIT 1
            """
        )
        row = cur.fetchone()
        conn.close()

        assert row is not None
        assert str(row[0]) == "Baru"
        assert int(row[3]) == 1
        assert int(row[4]) == 0


def test_customer_model_delete_customer_soft_delete_when_status_columns_exist():
    with tempfile.TemporaryDirectory() as td:
        db_path = str(Path(td) / "customer_model_soft_delete.db")
        _seed_customer_table(db_path, include_status_trash=True)
        model = _build_model(db_path)

        conn = sqlite3.connect(db_path)
        cur = conn.cursor()
        cur.execute(
            """
            INSERT INTO per_customers (id, nama, alamat_1, tlp_1, status, trash)
            VALUES (1, 'Hapus Saya', 'Jl X', '080', 1, 0)
            """
        )
        conn.commit()
        conn.close()

        model.delete_customer(1)

        conn = sqlite3.connect(db_path)
        cur = conn.cursor()
        cur.execute("SELECT status, trash FROM per_customers WHERE id = 1")
        row = cur.fetchone()
        conn.close()

        assert row is not None
        assert int(row[0]) == 0
        assert int(row[1]) == 1
        assert model.count_customers() == 0


def test_customer_model_delete_customer_fallback_hard_delete_for_legacy_schema():
    with tempfile.TemporaryDirectory() as td:
        db_path = str(Path(td) / "customer_model_legacy_delete.db")
        _seed_customer_table(db_path, include_status_trash=False)
        model = _build_model(db_path)

        conn = sqlite3.connect(db_path)
        cur = conn.cursor()
        cur.execute(
            """
            INSERT INTO per_customers (id, nama, alamat_1, tlp_1)
            VALUES (1, 'Legacy', 'Jl L', '089')
            """
        )
        conn.commit()
        conn.close()

        model.delete_customer(1)

        conn = sqlite3.connect(db_path)
        cur = conn.cursor()
        cur.execute("SELECT COUNT(1) FROM per_customers")
        count = int(cur.fetchone()[0] or 0)
        conn.close()

        assert count == 0
