"""Dashboard endpoints."""

from datetime import datetime, timedelta, timezone
from typing import List, Optional

from fastapi import APIRouter, Depends, Query
from sqlalchemy import func

from ..database import get_session
from ..models.license import License
from ..security import require_roles

router = APIRouter()


@router.get("/summary")
def summary(session=Depends(get_session), _admin=Depends(require_roles("super-admin", "analyst"))):
    total = session.query(func.count(License.id)).scalar() or 0
    # Use is_active column instead of status property
    active = session.query(func.count(License.id)).filter(License.is_active == True).scalar() or 0
    suspended = session.query(func.count(License.id)).filter(License.is_active == False).scalar() or 0
    # Use lowercase tier names as stored in database
    enterprise = session.query(func.count(License.id)).filter(
        func.lower(License.tier).in_(['entreprise', 'enterprise'])
    ).scalar() or 0
    pro = session.query(func.count(License.id)).filter(
        func.lower(License.tier) == 'pro'
    ).scalar() or 0

    return {
        "total": total,
        "active": active,
        "suspended": suspended,
        "enterprise": enterprise,
        "pro": pro,
    }


@router.get("/tiers")
def tier_distribution(session=Depends(get_session), _admin=Depends(require_roles("super-admin", "analyst"))):
    tiers = (
        session.query(License.tier, func.count(License.id))
        .group_by(License.tier)
        .order_by(func.count(License.id).desc())
        .all()
    )
    return {tier: count for tier, count in tiers}


@router.get("/activity")
def activity(
    days: int = Query(30, ge=1, le=365),
    session=Depends(get_session),
    _admin=Depends(require_roles("super-admin", "analyst")),
):
    since = datetime.now(timezone.utc) - timedelta(days=days)
    rows = (
        session.query(func.date(License.created_at), func.count(License.id))
        .filter(License.created_at >= since)
        .group_by(func.date(License.created_at))
        .order_by(func.date(License.created_at))
        .all()
    )
    return {str(date): count for date, count in rows}
