# upgraded: inherit base class
import csv
import logging
from pathlib import Path
from PySide6.QtGui import QColor, QPalette
from PySide6.QtWidgets import QLineEdit, QTextEdit, QSpinBox, QDoubleSpinBox
from PySide6.QtCore import Qt
from PySide6.QtWidgets import QTableWidgetItem
from PySide6.QtGui import QColor
from PySide6.QtCore import Qt
from pypos.core.utils.path_utils import get_app_data_resource_dir

LOGGER = logging.getLogger(__name__)

def set_editable_only_column(table_widget, editable_columns):
    for row in range(table_widget.rowCount()):
        for col in range(table_widget.columnCount()):
            item = table_widget.item(row, col)
            if not item:
                item = QTableWidgetItem()
                table_widget.setItem(row, col, item)
            flags = item.flags()
            if col in editable_columns:
                item.setFlags(flags | Qt.ItemIsEditable)
            else:
                item.setFlags(flags & ~Qt.ItemIsEditable)


def get_print_mode_from_csv():
    csv_path = Path(get_app_data_resource_dir()) / "setting_struk.csv"
    try:
        with open(csv_path, "r", encoding="utf-8") as f:
            reader = csv.reader(f)
            for row in reader:
                if len(row) >= 2 and row[0].strip() == "print_mode":
                    return row[1].strip().lower()
    except (OSError, UnicodeDecodeError, csv.Error) as e:
        LOGGER.warning("Gagal membaca print_mode dari CSV: %s", e)
    return "preview"


def parse_rupiah(text: str) -> float:
    if text is None:
        return 0.0
    cleaned = str(text).strip().replace(".", "").replace(",", ".")
    try:
        return float(cleaned)
    except ValueError:
        return 0.0


def set_readonly_style(widget, readonly=True):
    palette = widget.palette()
    bg_color = "#F5F5F5" if readonly else "#FFFFFF"
    palette.setColor(QPalette.Base, QColor(bg_color))
    widget.setPalette(palette)
    LOGGER.debug("set_readonly_style readonly=%s widget=%s", readonly, type(widget).__name__)
    # widget.setReadOnly(readonly)
    # Perlakuan berdasarkan tipe widget
    if isinstance(widget, (QLineEdit, QTextEdit)):
        widget.setReadOnly(readonly)
    elif isinstance(widget, (QSpinBox, QDoubleSpinBox)):
        widget.setButtonSymbols(QSpinBox.NoButtons if readonly else QSpinBox.UpDownArrows)
        widget.setFocusPolicy(Qt.NoFocus if readonly else Qt.StrongFocus)
        widget.setEnabled(not readonly)
    else:
        widget.setEnabled(not readonly)

def set_table_row_editable(table, row, editable_column_indexes):
    editable_columns = set()
    for raw_col in list(editable_column_indexes or []):
        try:
            editable_columns.add(int(raw_col))
        except (TypeError, ValueError):
            continue
    for col in range(table.columnCount()):
        item = table.item(row, col)
        if not item:
            item = QTableWidgetItem()
            table.setItem(row, col, item)
        if not item:
            continue
        if col in editable_columns:
            item.setFlags(item.flags() | Qt.ItemIsEditable)
            item.setBackground(QColor("#FFFFFF"))  # putih
        else:
            item.setFlags(item.flags() & ~Qt.ItemIsEditable)
            item.setBackground(QColor("#F50000"))  # abu-abu muda
