import enum
from datetime import datetime
from typing import Optional

from sqlalchemy import DECIMAL, Boolean, Column, DateTime
from sqlalchemy import Enum
from sqlalchemy import Enum as SAEnum
from sqlalchemy import ForeignKey, Integer, String, Text, UniqueConstraint
from sqlalchemy.orm import relationship

from src.apps.match.enums import (
    RequestType,
    Separator,
    Source,
    SourceEnum,
    Status,
    WineDbStatus,
)
from src.core.models.base import Base


class JobLog(Base):
    __tablename__ = "job_logs"

    id = Column(Integer, primary_key=True, index=True)
    literal = Column(String, nullable=True)
    code = Column(String, index=True)
    name = Column(String, nullable=True)
    url = Column(Text, nullable=True)
    status = Column(String, index=True)

    total_records = Column(Integer, default=0)
    total_prices = Column(DECIMAL, default=0)

    date_start = Column(DateTime)
    date_end = Column(DateTime)
    message = Column(Text, nullable=True)

    # Validation fields
    total_validation = Column(Integer, default=0)
    validation_passed = Column(Integer, default=0)
    validation_warn = Column(Integer, default=0)
    validation_failed = Column(Integer, default=0)
    validation_status = Column(String, index=True, nullable=True)
    validation_message = Column(Text, nullable=True)

    # Audit fields
    deleted_at = Column(DateTime, nullable=True)
    date_created = Column(DateTime, default=datetime.utcnow)
    last_updated = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)

    # Optional job date for filtering (set manually or computed in query)
    job_date = Column(DateTime, nullable=True)


class MatchedLog(Base):
    __tablename__ = "matched_logs"

    id = Column(Integer, primary_key=True, index=True)
    literal = Column(String, nullable=True)
    code = Column(String, index=True)
    process_keyword = Column(Boolean, default=True)

    total_records = Column(Integer, default=0)
    history_matched = Column(Integer, default=0)
    keyword_matched = Column(Integer, default=0)
    ambiguous_matched = Column(Integer, default=0)
    unknown_wines = Column(Integer, default=0)

    status = Column(String)
    crawl_date = Column(DateTime)
    date_start = Column(DateTime)
    date_end = Column(DateTime)
    message = Column(Text, nullable=True)

    date_created = Column(DateTime, default=datetime.utcnow)
    last_updated = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
    deleted_at = Column(DateTime, nullable=True)
