from datetime import datetime
from sqlalchemy import Column, Integer, String, Text, DateTime, ForeignKey, Boolean, JSON
from sqlalchemy.orm import relationship
from ..database import Base

class PromptTemplate(Base):
    __tablename__ = 'prompt_templates'

    id = Column(Integer, primary_key=True, index=True)
    slug = Column(String, unique=True, index=True, nullable=False)
    title = Column(String, nullable=False)
    content = Column(Text, nullable=False)
    version = Column(Integer, default=1)
    
    owner_id = Column(String, ForeignKey('users.id'), nullable=False)
    group_id = Column(String, ForeignKey('groups.id'), nullable=True)
    is_public = Column(Boolean, default=False)
    
    created_at = Column(DateTime, default=datetime.utcnow)
    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)

    owner = relationship("User")
    group = relationship("Group")

    def __repr__(self):
        return f"<PromptTemplate(slug='{self.slug}', version={self.version})>"

class Skill(Base):
    __tablename__ = 'skills'

    id = Column(Integer, primary_key=True, index=True)
    name = Column(String, unique=True, index=True, nullable=False)
    description = Column(String, nullable=True)
    skill_type = Column(String, default="local", nullable=False)
    config = Column(JSON, default={}, nullable=True)
    
    system_prompt = Column(Text, nullable=True)
    is_enabled = Column(Boolean, default=True)
    features = Column(JSON, default=["chat"], nullable=True)
    
    owner_id = Column(String, ForeignKey('users.id'), nullable=False)
    is_system = Column(Boolean, default=False)
    
    preview_markdown = Column(Text, nullable=True)
    extra_metadata = Column(JSON, default={}, nullable=True)
    
    created_at = Column(DateTime, default=datetime.utcnow)
    
    owner = relationship("User")

    def __repr__(self):
        return f"<Skill(name='{self.name}', type='{self.skill_type}')>"

class SkillGroupAccess(Base):
    __tablename__ = 'skill_group_access'
    
    id = Column(Integer, primary_key=True, index=True)
    skill_id = Column(Integer, ForeignKey('skills.id'), nullable=False)
    group_id = Column(String, ForeignKey('groups.id'), nullable=False)
    
    granted_by = Column(String, ForeignKey('users.id'), nullable=False)
    granted_at = Column(DateTime, default=datetime.utcnow)
    
    skill = relationship("Skill")
    group = relationship("Group")

class MCPServer(Base):
    __tablename__ = 'mcp_servers'

    id = Column(Integer, primary_key=True, index=True)
    name = Column(String, nullable=False)
    url = Column(String, nullable=False)
    auth_config = Column(JSON, default={}, nullable=True)
    
    owner_id = Column(String, ForeignKey('users.id'), nullable=False)
    group_id = Column(String, ForeignKey('groups.id'), nullable=True)
    
    created_at = Column(DateTime, default=datetime.utcnow)

    owner = relationship("User")
    group = relationship("Group")

    def __repr__(self):
        return f"<MCPServer(name='{self.name}', url='{self.url}')>"

class AssetPermission(Base):
    __tablename__ = 'asset_permissions'

    id = Column(Integer, primary_key=True, index=True)
    resource_type = Column(String, nullable=False, index=True)
    resource_id = Column(Integer, nullable=False, index=True)
    
    user_id = Column(String, ForeignKey('users.id'), nullable=True)
    group_id = Column(String, ForeignKey('groups.id'), nullable=True)
    
    access_level = Column(String, default="execute", nullable=False)
    created_at = Column(DateTime, default=datetime.utcnow)

    user = relationship("User")
    group = relationship("Group")

    def __repr__(self):
        return f"<AssetPermission(type='{self.resource_type}', id={self.resource_id}, level='{self.access_level}')>"
