from fastapi import APIRouter, Depends, HTTPException, Request, status
from slowapi import Limiter
from slowapi.errors import RateLimitExceeded
from slowapi.util import get_remote_address
from sqlalchemy.ext.asyncio import AsyncSession

from .. import captcha
from ..database import get_db
from ..models import ContactSubmission
from ..schemas import ContactCreate, ContactResponse
from ..config import get_settings

router = APIRouter(prefix="/api/v1", tags=["contact"])
settings = get_settings()
limiter = Limiter(key_func=get_remote_address)


@router.post(
    "/contact",
    response_model=ContactResponse,
    status_code=status.HTTP_201_CREATED,
)
@limiter.limit(settings.rate_limit)
async def submit_contact(
    request: Request,
    payload: ContactCreate,
    db: AsyncSession = Depends(get_db),
) -> ContactResponse:
    client_ip = request.client.host if request.client else None
    if not client_ip:
        raise HTTPException(
            status_code=status.HTTP_400_BAD_REQUEST,
            detail="Unable to determine client IP address.",
        )

    captcha_ok = await captcha.verify_captcha(payload.captcha_token, remote_ip=client_ip)
    if not captcha_ok:
        raise HTTPException(
            status_code=status.HTTP_400_BAD_REQUEST,
            detail="Captcha verification failed.",
        )

    hashed_ip = ContactSubmission.hash_ip(client_ip)
    submission = ContactSubmission(
        first_name=payload.first_name.strip(),
        last_name=payload.last_name.strip(),
        email=payload.email.strip(),
        company_name=payload.company_name.strip(),
        country=payload.country.strip(),
        job_title=payload.job_title.strip(),
        inquiry_type=payload.inquiry_type.value,
        message=payload.message.strip(),
        privacy_policy_agreement=str(payload.privacy_policy_agreement).lower(),
        ip_address=hashed_ip,
    )
    db.add(submission)
    await db.commit()
    await db.refresh(submission)

    return ContactResponse(id=str(submission.id), created_at=submission.created_at.isoformat())


async def rate_limit_handler(request: Request, exc: RateLimitExceeded):
    raise HTTPException(
        status_code=status.HTTP_429_TOO_MANY_REQUESTS,
        detail="Too many requests. Please try again later.",
    )
