import logging
from datetime import datetime
from typing import Any, Dict, List, Optional

from fastapi import FastAPI, HTTPException, Request
from pydantic import BaseModel
from sqlalchemy.orm import Session

from src.apps.match.enums import MatchedType
from src.apps.match.job.wine_match_job import wine_match_job
from src.apps.match.schemas.wine_db import DataResult, RetailerItem, RetailersRequest
from src.apps.match.services.output_service import *

logger = logging.getLogger(__name__)

output_service = OutputService()


async def proceed(db: Session, payload: RetailersRequest, request: Request):
    params = payload

    codes = []
    run_keywords = []
    dates = []
    errors = []

    sdf = "%Y-%m-%d"
    run_keyword_flag = (params.matched_type or "").upper() == MatchedType.KEYWORD

    for key, value in params.clients.items():
        if "." in key:
            continue

        codes.append(value.code)
        run_keywords.append(run_keyword_flag)

        date_obj = None
        if value.date:
            try:
                date_obj = datetime.strptime(value.date, sdf)
            except Exception as e:
                logger.error(f"Date parse error: {e}")
        dates.append(date_obj)
    print(f"Codes: {codes}, Run Keywords: {run_keywords}, Dates: {dates}")
    for idx, code in enumerate(codes):
        date = dates[idx]
        if date:
            if not output_service.is_valid_crawl_output(code, date):
                errors.append(f"Input file not found for [{code}] at date [{date.strftime(sdf)}]")
        else:
            errors.append(f"Input file not found for [{code}] at date [null]")
    print(f"Errors: {errors}")
    if errors:
        raise HTTPException(status_code=400, detail={"errors": errors})

    # try:
    await wine_match_job(
        db,
        codes=codes,
        run_keywords=run_keywords,
        dates=[d.strftime(sdf) if d else None for d in dates],
        mode=params.mode,
    )
    # except Exception as e:
    #     print(e)

    return DataResult(success=True, errors=[])
