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

from app.models.base import BaseModel


class ModelProvider(BaseModel):
    __tablename__ = "model_providers"
    __table_args__ = {"schema": "public"}
    name = Column(String(100), nullable=False)
    description = Column(String(255), nullable=True)
    icon = Column(String(50), nullable=True)
    color = Column(String(20), nullable=True)
    configured = Column(Boolean, default=False)
    default_base_url = Column(String(255), nullable=True)
    api_key = Column(String(255), nullable=True)
    base_url = Column(String(255), nullable=True)
    priority = Column(Integer, default=100)
    enabled = Column(Boolean, default=True)
    provider_kind = Column(String(50), nullable=True)
    protocol = Column(String(50), nullable=True)
    auth_type = Column(String(50), nullable=True)
    capabilities = Column(JSON, nullable=True)
    is_local = Column(Boolean, default=False)
    healthcheck_path = Column(String(255), nullable=True)
    extra_config = Column(JSON, nullable=True)
    models = relationship("Model", back_populates="provider", cascade="all, delete-orphan")

    def set_api_key(self, plaintext_key: str) -> None:
        from app.core.encryption import encryption_service

        if plaintext_key:
            self.api_key = encryption_service.encrypt(plaintext_key)
        else:
            self.api_key = None

    def get_api_key(self) -> str:
        from app.core.encryption import encryption_service

        if self.api_key:
            return encryption_service.decrypt(self.api_key)
        return None


class Model(BaseModel):
    __tablename__ = "models"
    __table_args__ = {"schema": "public"}
    provider_id = Column(Integer, ForeignKey("public.model_providers.id"), nullable=False)
    code = Column(String(255), nullable=False, unique=True)
    name = Column(String(255), nullable=False)
    type = Column(String(50), nullable=False)
    tags = Column(JSON, nullable=True)
    dimension = Column(Integer, nullable=True)
    enabled = Column(Boolean, default=True)
    is_active = Column(Boolean, default=True)
    remote_model_id = Column(String(255), nullable=True)
    context_length = Column(Integer, nullable=True)
    max_output_tokens = Column(Integer, nullable=True)
    supports_stream = Column(Boolean, default=True)
    supports_tools = Column(Boolean, default=False)
    priority = Column(Integer, default=100)
    extra_config = Column(JSON, nullable=True)
    provider = relationship("ModelProvider", back_populates="models")
