from fastapi import APIRouter, Query, HTTPException, Depends
from typing import List
from src.auth.dependencies import get_current_user
from .dependencies import WoodpeckerServiceDep
from .models import (
    MailboxMongo,
    MailboxDetails,
    MailboxBulkRequest,
    CampaignMongo,
    CampaignResponse,
    CampaignCreateRequest,
    CampaignUpdateRequest,
    AddProspectsRequest,
    WoodpeckerSyncResponse
)

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

# ──────────────────────────────────────────────
# Mailboxes
# ──────────────────────────────────────────────

@router.get("/mailboxes", response_model=List[MailboxMongo])
async def list_mailboxes(
    service: WoodpeckerServiceDep,
    user_id: str = Depends(get_current_user),
    force_sync: bool = Query(False, description="Force sync from Woodpecker API")
):
    """List mailboxes for the current user."""
    return await service.list_mailboxes(user_id, force_sync)

@router.get("/mailboxes/{mailbox_id}/summary", response_model=MailboxDetails)
async def get_mailbox_summary(
    mailbox_id: int,
    service: WoodpeckerServiceDep,
    user_id: str = Depends(get_current_user)
):
    """Get 24h summary for a specific mailbox."""
    try:
        return await service.get_mailbox_summary(mailbox_id)
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

@router.post("/mailboxes/bulk")
async def add_mailboxes_bulk(
    request: MailboxBulkRequest,
    service: WoodpeckerServiceDep,
    user_id: str = Depends(get_current_user)
):
    """Add multiple mailboxes via manual connection."""
    try:
        return await service.add_mailboxes_bulk(user_id, request)
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

# ──────────────────────────────────────────────
# Campaigns
# ──────────────────────────────────────────────

@router.get("/campaigns", response_model=List[CampaignMongo])
async def list_campaigns(
    service: WoodpeckerServiceDep,
    user_id: str = Depends(get_current_user),
    force_sync: bool = Query(False, description="Force sync from Woodpecker API")
):
    """List campaigns for the current user."""
    return await service.list_campaigns(user_id, force_sync)

@router.post("/campaigns", response_model=CampaignResponse)
async def create_campaign(
    request: CampaignCreateRequest,
    service: WoodpeckerServiceDep,
    user_id: str = Depends(get_current_user)
):
    """Create a new campaign."""
    try:
        return await service.create_campaign(user_id, request)
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

@router.patch("/campaigns/{campaign_id}")
async def update_campaign(
    campaign_id: int,
    request: CampaignUpdateRequest,
    service: WoodpeckerServiceDep,
    user_id: str = Depends(get_current_user)
):
    """Update settings for an existing campaign."""
    try:
        return await service.update_campaign(user_id, campaign_id, request)
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

@router.post("/campaigns/{campaign_id}/add-prospects")
async def add_prospects(
    campaign_id: int,
    request: AddProspectsRequest,
    service: WoodpeckerServiceDep,
    user_id: str = Depends(get_current_user)
):
    """Add prospects to a campaign."""
    if campaign_id != request.campaign_id:
        raise HTTPException(status_code=400, detail="Campaign ID mismatch")
    try:
        return await service.add_prospects_to_campaign(request)
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

@router.post("/campaigns/{campaign_id}/run")
async def run_campaign(
    campaign_id: int,
    service: WoodpeckerServiceDep,
    user_id: str = Depends(get_current_user)
):
    """Run a campaign."""
    try:
        return await service.run_campaign(campaign_id)
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

# ──────────────────────────────────────────────
# Sync
# ──────────────────────────────────────────────

@router.post("/sync", response_model=WoodpeckerSyncResponse)
async def sync_all(
    service: WoodpeckerServiceDep,
    user_id: str = Depends(get_current_user)
):
    """Manually trigger a full resync of mailboxes and campaigns."""
    return await service.sync_all(user_id)
