"""REST API router for Contacts management, vCard import/export, and IMAP Maildir sync."""

from __future__ import annotations

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

from fastapi import APIRouter, Depends, File, Form, HTTPException, Query, Request, Response, UploadFile, status
from fastapi.responses import JSONResponse, PlainTextResponse
from sqlalchemy.orm import Session

from ..contacts_ops import (
    create_account_contact,
    delete_account_contact,
    get_account_contacts,
    parse_vcard_content,
    update_account_contact,
)
from ..db import get_db
from ..models import Contact
from ..security import require_admin, require_panel_session
from ..settings import get_settings

logger = logging.getLogger(__name__)

router = APIRouter(prefix="/contacts", tags=["contacts"])


@router.get("")
def list_contacts(
    request: Request,
    account: str = Query(...),
    q: str = Query(""),
    db: Session = Depends(get_db),
    admin: dict = Depends(require_admin),
):
    """List all contacts for an account with optional search query."""
    contacts = get_account_contacts(db, account, q)
    return [
        {
            "id": c.id,
            "account_username": c.account_username,
            "first_name": c.first_name,
            "last_name": c.last_name,
            "company": c.company,
            "email": c.email,
            "phone": c.phone,
            "address": c.address,
            "notes": c.notes,
            "created_at": c.created_at.isoformat() if c.created_at else None,
            "updated_at": c.updated_at.isoformat() if c.updated_at else None,
        }
        for c in contacts
    ]


@router.post("")
def create_contact(
    request: Request,
    account: str = Form(...),
    first_name: str = Form(""),
    last_name: str = Form(""),
    email: str = Form(...),
    phone: str = Form(""),
    company: str = Form(""),
    address: str = Form(""),
    notes: str = Form(""),
    db: Session = Depends(get_db),
    admin: dict = Depends(require_admin),
):
    """Create a new contact record and sync to IMAP Maildir."""
    data = {
        "first_name": first_name,
        "last_name": last_name,
        "email": email,
        "phone": phone,
        "company": company,
        "address": address,
        "notes": notes,
    }
    c = create_account_contact(db, account, data)
    return {
        "id": c.id,
        "account_username": c.account_username,
        "first_name": c.first_name,
        "last_name": c.last_name,
        "email": c.email,
        "phone": c.phone,
        "company": c.company,
        "address": c.address,
        "notes": c.notes,
    }


@router.get("/{contact_id}")
def get_contact_detail(
    contact_id: int,
    db: Session = Depends(get_db),
    admin: dict = Depends(require_admin),
):
    """Get single contact details."""
    c = db.query(Contact).filter(Contact.id == contact_id).first()
    if not c:
        raise HTTPException(status_code=404, detail="Contact not found")
    return {
        "id": c.id,
        "account_username": c.account_username,
        "first_name": c.first_name,
        "last_name": c.last_name,
        "company": c.company,
        "email": c.email,
        "phone": c.phone,
        "address": c.address,
        "notes": c.notes,
        "vcard_data": c.vcard_data,
    }


@router.delete("/{contact_id}")
def delete_contact(
    contact_id: int,
    db: Session = Depends(get_db),
    admin: dict = Depends(require_admin),
):
    """Delete a contact and remove from IMAP Maildir."""
    c = db.query(Contact).filter(Contact.id == contact_id).first()
    if not c:
        raise HTTPException(status_code=404, detail="Contact not found")
    delete_account_contact(db, c)
    return {"ok": True, "message": "Contact deleted successfully"}


@router.get("/{contact_id}/vcard")
def download_vcard(
    contact_id: int,
    db: Session = Depends(get_db),
):
    """Download contact in vCard (.vcf) format."""
    c = db.query(Contact).filter(Contact.id == contact_id).first()
    if not c or not c.vcard_data:
        raise HTTPException(status_code=404, detail="vCard not found")
    fn = f"{c.first_name}_{c.last_name}".strip("_") or "contact"
    return PlainTextResponse(
        content=c.vcard_data,
        media_type="text/vcard",
        headers={"Content-Disposition": f'attachment; filename="{fn}.vcf"'},
    )
