"""Dashboard BFF routes for P2HS Discord community OAuth."""
from __future__ import annotations

from fastapi import APIRouter, Depends, Query
from sqlalchemy.ext.asyncio import AsyncSession

from src.core.database import get_db
from src.domain.auth.models import User
from src.domain.auth.repository import UserRepository
from src.domain.auth.router import get_current_user
from src.domain.billing.repository import SubscriptionRepository
from src.domain.discord_community.schemas import DiscordConnectionResponse, DiscordConnectUrlResponse
from src.domain.discord_community.service import DiscordCommunityService
from src.domain.workspaces.repository import WorkspaceRepository

router = APIRouter(prefix="/api/integrations/discord", tags=["discord-community"])


def _service(db: AsyncSession) -> DiscordCommunityService:
    return DiscordCommunityService(
        users=UserRepository(db),
        workspaces=WorkspaceRepository(db),
        subscriptions=SubscriptionRepository(db),
    )


@router.get("/connect-url", response_model=DiscordConnectUrlResponse)
async def discord_connect_url(
    user: User = Depends(get_current_user),
    db: AsyncSession = Depends(get_db),
):
    url, _state = _service(db).build_connect_url(user.id)
    return DiscordConnectUrlResponse(connect_url=url, configured=True)


@router.get("/connection", response_model=DiscordConnectionResponse)
async def discord_connection(
    user: User = Depends(get_current_user),
):
    return DiscordConnectionResponse(
        connected=bool(getattr(user, "discord_user_id", None)),
        discord_user_id=getattr(user, "discord_user_id", None),
        discord_username=getattr(user, "discord_username", None),
    )


@router.get("/callback", response_model=DiscordConnectionResponse)
async def discord_oauth_callback(
    code: str = Query(...),
    state: str = Query(...),
    user: User = Depends(get_current_user),
    db: AsyncSession = Depends(get_db),
):
    result = await _service(db).complete_oauth(user_id=user.id, code=code, state=state)
    await db.commit()
    return DiscordConnectionResponse.model_validate(result)
