from sqlalchemy import Boolean, Integer, ForeignKey, String, Text, JSON
from sqlalchemy.orm import relationship, Mapped, mapped_column
from typing import Optional, TYPE_CHECKING
from src.apps.base.models.base import Base
from src.core.utils.enums import SettingsInputFieldTypes

if TYPE_CHECKING:
    from typing import Any


class MerchantSettings(Base):
    """
    MerchantSettings Model: ORM class for MerchantSettings Entity
    """

    __tablename__ = "merchant_settings"

    id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True, autoincrement=True)
    key: Mapped[str] = mapped_column(String(255))
    value: Mapped[str] = mapped_column(Text)
    label: Mapped[str] = mapped_column(Text)
    group: Mapped[str] = mapped_column(String(255))
    field_name: Mapped[str] = mapped_column(String(255))
    field_type: Mapped[str] = mapped_column(String(50), default=SettingsInputFieldTypes.INPUT)
    field_options: Mapped[Optional[dict]] = mapped_column(JSON, nullable=True)
    has_lock: Mapped[Optional[bool]] = mapped_column(Boolean, nullable=True)
    is_locked: Mapped[Optional[bool]] = mapped_column(Boolean, nullable=True)
    display_order: Mapped[int] = mapped_column(Integer, default=0)

    merchant_id: Mapped[int] = mapped_column(Integer, ForeignKey("merchants.id"))
    merchant: Mapped["Merchant"] = relationship("Merchant")
