"buyer_intake router"

import logging
from typing import Annotated, List
from datetime import datetime
from fastapi import APIRouter, Depends, HTTPException, status, Request
from sqlalchemy.exc import IntegrityError

from utils.mysql_db import mysql_db
from schemas.buyer_intake_form import BuyerCreate, BuyerOut
from models.buyer_intake import BuyerIntake, BuyerLocation, BuyerIndustry
from services.buyer_intake.index import BuyerIntakeService

XCM_logger = logging.getLogger()

buyer_intake = APIRouter(
    prefix="/buyerintake",
    tags=["buyer_intake"],
    responses={404: {"description": "Not found"}},
    dependencies=[],  # add dependencies here
)


async def create_buyer_intake(
    request: Request,
    buyer_intake_form_data: BuyerCreate,
):
    """Create a team class with the provided parameters"""

    current_user_id = request.state.user_id

    buyer_intake = BuyerIntake(
        first_name=buyer_intake_form_data.first_name,
        last_name=buyer_intake_form_data.last_name,
        email=buyer_intake_form_data.email,
        phone=buyer_intake_form_data.phone,
        additional_info=buyer_intake_form_data.additional_info,
        deal_size=buyer_intake_form_data.deal_size,
        revenue_multiple=buyer_intake_form_data.revenue_multiple,
        ebidta_multiple=buyer_intake_form_data.ebidta_multiple,
        irr=buyer_intake_form_data.irr,
        is_financing_needed=buyer_intake_form_data.is_financing_needed,
        time_frame=buyer_intake_form_data.time_frame,
        created_by=current_user_id,
        created_at=datetime.now(),
    )
    buyer_intake.update_modify(current_user_id)
    return (
        buyer_intake,
        buyer_intake_form_data.locations,
        buyer_intake_form_data.industries,
        current_user_id,
    )


BuyerIntakeDependency = Annotated[
    tuple[BuyerIntake, list[str], list[str], str], Depends(create_buyer_intake)
]


@buyer_intake.post(
    "/submit",
    response_description="Buyer Intake Form Submitted",
)
async def submit_buyer_intake(buyer_intake_form_data: BuyerIntakeDependency):
    "Upload files to the project."
    try:
        buyer_intake, locations, industries, current_user_id = buyer_intake_form_data

        saved_buyer = await BuyerIntakeService.insert_new_record(
            mysql_db, current_user_id, buyer_intake, locations, industries
        )
        return saved_buyer
    except IntegrityError as e:
        raise HTTPException(
            status_code=status.HTTP_400_BAD_REQUEST,
            detail={"message": "Email ID Already Exists"},
        )
    except Exception as e:  # pylint: disable=broad-except
        XCM_logger.error(e)
        raise HTTPException(
            status_code=status.HTTP_400_BAD_REQUEST, detail={"message": str(e)}
        )


@buyer_intake.get(
    "/{buyer_intake_id}",
    response_description="Buyer Intake Form Submitted",
    response_model=List[BuyerOut],
)
async def get_buyer_intake(buyer_intake_id: int):
    "Get a buyer intake form by id"
    buyer_intake = await BuyerIntakeService.get_buyer_intake_form(
        mysql_db, buyer_intake_id
    )

    if buyer_intake is None:
        print("buyer_intake is None")
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND, detail="Buyer intake form not found"
        )

    return buyer_intake
