# coding: utf-8
from PyQt5.QtCore import QModelIndex, Qt
from PyQt5.QtWidgets import QWidget, QStackedLayout

from mhw_armor_edit.editor.models import EditorPlugin
from mhw_armor_edit.ftypes.oam_dat import OAmDat, OAmDatEntry
from mhw_armor_edit.struct_table import StructTableModel, SortFilterTableView
from mhw_armor_edit.utils import get_t9n


(id, *fields) = OAmDatEntry.fields()
columns = (id, "series", "name", "description", *fields)


class OtomoArmorTableModel(StructTableModel):
    def __init__(self, parent=None):
        super().__init__(columns, parent)

    def get_field_value(self, entry, field):
        if field == "name":
            return get_t9n(self.model, "t9n_armor", entry.gmd_name_index)
        if field == "description":
            return get_t9n(self.model, "t9n_armor", entry.gmd_desc_index)
        if field == "series":
            return get_t9n(self.model, "t9n_armor_series", entry.set_id)
        return getattr(entry, field)

    def flags(self, qindex: QModelIndex):
        if qindex.isValid():
            if qindex.column() in (1, 2, 3):
                return super().flags(qindex) & ~Qt.ItemIsEditable
        return super().flags(qindex)

    def update(self, model):
        self.model = model
        entries = [] if model is None else model.data.entries
        super().update(entries)


class OtomoArmorEditor(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.model = None
        self.table_model = OtomoArmorTableModel(self)
        self.table_view = SortFilterTableView(self)
        self.table_view.setModel(self.table_model)
        self.setLayout(QStackedLayout(self))
        self.layout().addWidget(self.table_view)

    def set_model(self, model):
        self.model = model
        self.table_model.update(model)


class OtomoArmorEditorPlugin(EditorPlugin):
    pattern = "*.oam_dat"
    data_factory = OAmDat
    widget_factory = OtomoArmorEditor
    relations = {
        r"common\equip\otomoArmor.oam_dat": {
            "t9n_armor": r"common\text\steam\ot_armor_eng.gmd",
            "t9n_armor_series": r"common\text\steam\ot_series_eng.gmd",
        }
    }