from decimal import Decimal

from sqlalchemy.orm import Session, relationship

from src.apps.match.enums import Status
from src.apps.wine.wine_log.models.wine_log import JobLog, MatchedLog
from src.utils.enums import Separator
from src.apps.web_crawler.models.web_crawler import WebCrawler


def get_match_input_separator(self) -> Separator:
    return self.output_delimiter


def get_latest_job(self, db: Session):
    return db.query(JobLog).filter(JobLog.code == self.code).order_by(JobLog.date_created.desc()).first()


def get_found_records(self, db: Session) -> int:
    latest_job = self.get_latest_job(db)
    return latest_job.total_records if latest_job else 0


def get_latest_run(self, db: Session):
    latest_job = self.get_latest_job(db)
    return latest_job.date_start if latest_job else None


def get_proceed(self, db: Session) -> bool:
    latest_job = self.get_latest_job(db)
    return latest_job.status == Status.RUNNING if latest_job else False


def get_average_records(self, db: Session):
    logs = (
        db.query(JobLog.total_records)
        .filter_by(code=self.code, status=Status.SUCCESS, validation_status=Status.SUCCESS)
        .filter(JobLog.total_records != 0)
        .order_by(JobLog.date_created.desc())
        .limit(20)
        .all()
    )
    values = [r[0] for r in logs]
    return sum(values) / len(values) if values else 0


def get_average_prices(self, db: Session):
    logs = (
        db.query(JobLog.total_prices)
        .filter_by(code=self.code, status=Status.SUCCESS, validation_status=Status.SUCCESS)
        .filter(JobLog.total_prices != 0, JobLog.total_records != 0)
        .order_by(JobLog.date_created.desc())
        .limit(20)
        .all()
    )
    values = [Decimal(r[0]) for r in logs]
    return sum(values) / len(values) if values else Decimal("0")


def get_list_history_indexes(self):
    return [int(i) for i in (self.history_indexes or "").split(",") if i.strip().isdigit()]


def get_list_keyword_indexes(self):
    return [int(i) for i in (self.keyword_indexes or "").split(",") if i.strip().isdigit()]


def get_list_description_indexes(self):
    return [int(i) for i in (self.description_indexes or "").split(",") if i.strip().isdigit()]


def get_history_file_name(self):
    return self.history_name if self.history_name and self.history_name != "-" else self.code


def get_latest_history_matched(self, db: Session):
    return (
        db.query(MatchedLog)
        .filter_by(code=self.code, process_keyword=False)
        .order_by(MatchedLog.date_created.desc())
        .first()
    )


def get_latest_keyword_matched(self, db: Session):
    return (
        db.query(MatchedLog)
        .filter_by(code=self.code, process_keyword=True)
        .order_by(MatchedLog.date_created.desc())
        .first()
    )


def get_web_crawler(db: Session, code):
    # Assumes WebCrawler model exists and is imported
    return db.query(WebCrawler).filter_by(code=code).first()
