from typing import List

from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession

from app.database import get_db
from app.models.customer_query import CustomerQuery
from app.schemas.customer_query import (
    CustomerQueryCreate,
    CustomerQueryResponse,
    CustomerQueryUpdate,
)

router = APIRouter()


@router.post(
    "",
    response_model=CustomerQueryResponse,
    status_code=status.HTTP_201_CREATED,
)
async def create_customer_query(
    data: CustomerQueryCreate,
    db: AsyncSession = Depends(get_db),
):
    query = CustomerQuery(
        customer_name=data.customer_name,
        email=data.email,
        phone=data.phone,
        subject=data.subject,
        message=data.message,
        status="new",
        priority="normal",
    )

    db.add(query)
    await db.commit()
    await db.refresh(query)

    return query


@router.get(
    "",
    response_model=List[CustomerQueryResponse],
)
async def get_customer_queries(
    db: AsyncSession = Depends(get_db),
):
    result = await db.execute(
        select(CustomerQuery)
        .order_by(CustomerQuery.created_at.desc())
    )

    return result.scalars().all()


@router.get(
    "/{query_id}",
    response_model=CustomerQueryResponse,
)
async def get_customer_query(
    query_id: int,
    db: AsyncSession = Depends(get_db),
):
    result = await db.execute(
        select(CustomerQuery).where(
            CustomerQuery.id == query_id
        )
    )

    query = result.scalar_one_or_none()

    if query is None:
        raise HTTPException(
            status_code=404,
            detail="Customer query not found",
        )

    return query


@router.patch(
    "/{query_id}",
    response_model=CustomerQueryResponse,
)
async def update_customer_query(
    query_id: int,
    data: CustomerQueryUpdate,
    db: AsyncSession = Depends(get_db),
):
    result = await db.execute(
        select(CustomerQuery).where(
            CustomerQuery.id == query_id
        )
    )

    query = result.scalar_one_or_none()

    if query is None:
        raise HTTPException(
            status_code=404,
            detail="Customer query not found",
        )

    update_data = data.model_dump(exclude_unset=True)

    for field, value in update_data.items():
        setattr(query, field, value)

    await db.commit()
    await db.refresh(query)

    return query


@router.delete(
    "/{query_id}",
    status_code=status.HTTP_204_NO_CONTENT,
)
async def delete_customer_query(
    query_id: int,
    db: AsyncSession = Depends(get_db),
):
    result = await db.execute(
        select(CustomerQuery).where(
            CustomerQuery.id == query_id
        )
    )

    query = result.scalar_one_or_none()

    if query is None:
        raise HTTPException(
            status_code=404,
            detail="Customer query not found",
        )

    await db.delete(query)
    await db.commit()
