from sqlalchemy import (
    JSON,
    Boolean,
    Column,
    Date,
    DateTime,
    Float,
    ForeignKey,
    Index,
    Integer,
    String,
    Text,
)
from sqlalchemy.sql import func

from app.database import Base


class DataSource(Base):
    __tablename__ = 'data_sources'
    id = Column(Integer, primary_key=True)
    code = Column(String(50), unique=True, nullable=False)
    name = Column(String(200), nullable=False)
    source_type = Column(String(20), nullable=False)
    region_level = Column(String(20), nullable=False)
    region_code = Column(String(20))
    adapter_class = Column(String(200), nullable=False)
    adapter_config = Column(JSON)
    has_categories = Column(Boolean, default=False)
    crawl_schedule = Column(String(50))
    request_delay_min = Column(Float, default=1.0)
    request_delay_max = Column(Float, default=5.0)
    max_retries = Column(Integer, default=3)
    is_active = Column(Boolean, default=True)
    last_crawled_at = Column(DateTime)
    created_at = Column(DateTime, default=func.now())

class DataProcessingTask(Base):
    __tablename__ = 'data_processing_tasks'
    id = Column(Integer, primary_key=True, index=True)
    task_id = Column(String(50), unique=True, index=True, nullable=False)
    category_id = Column(Integer, index=True)
    source_id = Column(Integer, ForeignKey('data_sources.id'), index=True)
    mode = Column(String(20), nullable=False)
    status = Column(String(20), nullable=False, default='pending')
    progress = Column(Integer, default=0)
    total_count = Column(Integer, default=0)
    success_count = Column(Integer, default=0)
    failed_count = Column(Integer, default=0)
    error_message = Column(Text)
    started_at = Column(DateTime)
    completed_at = Column(DateTime)
    created_at = Column(DateTime, default=func.now())
    updated_at = Column(DateTime, default=func.now(), onupdate=func.now())
    __table_args__ = (Index('idx_task_status', 'status'), Index('idx_task_created', 'created_at'))

class TaxDocument(Base):
    __tablename__ = 'tax_documents'
    id = Column(Integer, primary_key=True, index=True)
    source_url = Column(String(500), unique=True, index=True, nullable=False)
    category_id = Column(Integer, index=True, nullable=False)
    doc_number = Column(String(100), index=True)
    title = Column(String(500), nullable=False)
    issuing_authority = Column(String(200))
    issue_date = Column(Date)
    effective_date = Column(Date)
    doc_status = Column(String(20), index=True)
    superseded_by_doc_id = Column(Integer)
    superseded_by_doc_number = Column(String(200))
    superseded_by_title = Column(String(500))
    superseded_by_source_url = Column(String(500))
    content_html = Column(Text)
    content_markdown = Column(Text)
    content_text = Column(Text)
    supersedes = Column(JSON)
    references = Column(JSON)
    file_path = Column(String(500))
    file_directory = Column(String(255))
    attachments = Column(JSON)
    inline_images = Column(JSON)
    inline_videos = Column(JSON)
    fetch_strategy = Column(String(20), default='normal')
    source_id = Column(Integer, ForeignKey('data_sources.id'), index=True)
    doc_type = Column(String(20), index=True)
    region_code = Column(String(20), index=True)
    qa_question = Column(Text)
    qa_answer = Column(Text)
    interpretation_form = Column(String(20), index=True)
    processing_status = Column(String(20), default='pending')
    content_hash = Column(String(64))
    last_check_time = Column(DateTime)
    is_imported = Column(Boolean, default=False)
    knowledge_doc_id = Column(Integer)
    created_at = Column(DateTime, default=func.now())
    updated_at = Column(DateTime, default=func.now(), onupdate=func.now())
    __table_args__ = (Index('idx_doc_category', 'category_id'), Index('idx_doc_status', 'processing_status'), Index('idx_doc_imported', 'is_imported'), Index('idx_doc_issue_date', 'issue_date'), Index('idx_doc_hash', 'content_hash'), Index('idx_doc_interp_form', 'interpretation_form'))

class TaxDocumentVersion(Base):
    __tablename__ = 'tax_document_versions'
    id = Column(Integer, primary_key=True, index=True)
    doc_id = Column(Integer, ForeignKey('tax_documents.id', ondelete='CASCADE'), nullable=False, index=True)
    version_number = Column(Integer, nullable=False)
    content_markdown = Column(Text)
    created_at = Column(DateTime, default=func.now())
    __table_args__ = (Index('idx_docver_doc_id', 'doc_id'),)

class ProcessingLog(Base):
    __tablename__ = 'processing_logs'
    id = Column(Integer, primary_key=True, index=True)
    task_id = Column(String(50), index=True)
    document_url = Column(String(500))
    log_level = Column(String(20), nullable=False)
    message = Column(Text, nullable=False)
    exception = Column(Text)
    created_at = Column(DateTime, default=func.now())
    __table_args__ = (Index('idx_log_task', 'task_id'), Index('idx_log_level', 'log_level'), Index('idx_log_created', 'created_at'))
