from sqlalchemy import JSON, Boolean, Column, ForeignKey, Integer, String, Text, UniqueConstraint
from sqlalchemy.orm import relationship

from app.models.base import BaseModel


class DataModel(BaseModel):
    __tablename__ = "data_models"
    __table_args__ = {"schema": "public"}
    name = Column(String(100), nullable=False)
    key = Column(String(100), unique=True, nullable=False)
    description = Column(Text, nullable=True)
    icon = Column(String(50), default="📊")
    type = Column(String(20), default="user")
    status = Column(String(20), default="enabled")
    tenant_id = Column(Integer, ForeignKey("public.tenants.id"), nullable=True)
    created_by = Column(Integer, ForeignKey("public.users.id"))
    fields = relationship(
        "DataModelField",
        back_populates="model",
        cascade="all, delete-orphan",
        order_by="DataModelField.sort_order",
    )


class DataModelField(BaseModel):
    __tablename__ = "data_model_fields"
    model_id = Column(Integer, ForeignKey("public.data_models.id"), nullable=False)
    field_name = Column(String(100), nullable=False)
    field_key = Column(String(100), nullable=False)
    field_type = Column(String(20), nullable=False)
    field_icon = Column(String(50), nullable=True)
    field_options = Column(JSON, nullable=True)
    default_value = Column(String(500), nullable=True)
    is_required = Column(Boolean, default=False)
    sort_order = Column(Integer, default=0)
    description = Column(Text, nullable=True)
    validation_rules = Column(JSON, nullable=True)
    model = relationship("DataModel", back_populates="fields")
    __table_args__ = (UniqueConstraint("model_id", "field_key", name="uq_model_field_key"),)
