# edited by glg
import csv
import json
from pathlib import Path
from unittest.mock import patch

import pytest

from pypos.modules.printer.models.printer_settings_model import PrinterSettingsModel

pytestmark = [pytest.mark.unit]


def _write_json(path: Path, payload: dict):
    path.write_text(json.dumps(payload, indent=2), encoding="utf-8")


def test_load_printers_recover_dari_backup_saat_file_utama_korup(tmp_path):
    main_path = tmp_path / "printers.json"
    backup_path = tmp_path / "printers.json.bak"
    main_path.write_text("{invalid json", encoding="utf-8")
    _write_json(
        backup_path,
        {
            "printers": [
                {
                    "id": 1,
                    "name": "POS-58",
                    "paper_size": "58mm",
                    "default": True,
                    "is_default": 1,
                }
            ]
        },
    )

    with patch(
        "pypos.modules.printer.models.printer_settings_model.get_app_data_resource_dir",
        return_value=str(tmp_path),
    ):
        model = PrinterSettingsModel()
        printers = model.load_printers()

    assert len(printers) == 1
    assert printers[0]["name"] == "POS-58"
    persisted = json.loads(main_path.read_text(encoding="utf-8"))
    assert persisted["printers"][0]["name"] == "POS-58"


def test_load_printers_fallback_kosong_saat_main_backup_sama_sama_korup(tmp_path):
    main_path = tmp_path / "printers.json"
    backup_path = tmp_path / "printers.json.bak"
    main_path.write_text("{invalid", encoding="utf-8")
    backup_path.write_text("{invalid", encoding="utf-8")

    with patch(
        "pypos.modules.printer.models.printer_settings_model.get_app_data_resource_dir",
        return_value=str(tmp_path),
    ):
        model = PrinterSettingsModel()
        printers = model.load_printers()

    assert printers == []
    assert json.loads(main_path.read_text(encoding="utf-8")) == {"printers": []}
    assert json.loads(backup_path.read_text(encoding="utf-8")) == {"printers": []}


def test_save_printers_menulis_file_utama_dan_backup(tmp_path):
    payload = [
        {
            "id": 7,
            "name": "Thermal LAN",
            "paper_size": "80mm",
            "default": True,
            "is_default": 1,
        }
    ]
    with patch(
        "pypos.modules.printer.models.printer_settings_model.get_app_data_resource_dir",
        return_value=str(tmp_path),
    ):
        model = PrinterSettingsModel()
        model.save_printers(payload)

    main_path = tmp_path / "printers.json"
    backup_path = tmp_path / "printers.json.bak"
    assert main_path.exists()
    assert backup_path.exists()
    assert json.loads(main_path.read_text(encoding="utf-8"))["printers"][0]["name"] == "Thermal LAN"
    assert json.loads(backup_path.read_text(encoding="utf-8"))["printers"][0]["name"] == "Thermal LAN"


def test_csv_setting_tetap_terupdate_dengan_atomic_write(tmp_path):
    with patch(
        "pypos.modules.printer.models.printer_settings_model.get_app_data_resource_dir",
        return_value=str(tmp_path),
    ):
        model = PrinterSettingsModel()
        model.set_print_mode("auto")
        model.set_history_retention_days(45)
        model.set_settlement_print_option("show_cash_recap", True)
        model.set_settlement_print_option("show_transaction_list", False)

    csv_path = tmp_path / "setting_struk.csv"
    assert csv_path.exists()
    rows = {}
    with open(csv_path, "r", encoding="utf-8", newline="") as fh:
        for row in csv.reader(fh):
            if len(row) >= 2:
                rows[str(row[0]).strip()] = str(row[1]).strip()

    assert rows.get("print_mode") == "auto"
    assert rows.get("history_retention_days") == "45"
    assert rows.get("settlement_show_cash_recap") == "1"
    assert rows.get("settlement_show_transaction_list") == "0"
