import uuid

from fastapi import APIRouter, Depends
from sqlalchemy.ext.asyncio import AsyncSession

from app.core.dependencies import get_current_actor
from app.core.responses import api_response, normalize_page_param, page_response
from app.db.database import get_async_session
from app.schemas.message import MessageCreate
from app.services.message_service import MessageService

router = APIRouter(prefix="/discussions", tags=["Messages"])


@router.post("/{discussion_id}/messages", status_code=201)
async def envoyer_message(
    discussion_id: uuid.UUID,
    body: MessageCreate,
    db: AsyncSession = Depends(get_async_session),
    actor=Depends(get_current_actor),
):
    service = MessageService(db)
    data = await service.envoyer_message(
        str(discussion_id),
        body,
        actor_type=actor.actor_type,
        actor_id=actor.actor_id,
        current_user=actor.user,
    )
    return api_response(data, message="Message envoyé", status_code=201)


@router.get("/{discussion_id}/messages")
async def list_messages(
    discussion_id: uuid.UUID,
    page: int = 0,
    size: int = 50,
    db: AsyncSession = Depends(get_async_session),
    actor=Depends(get_current_actor),
):
    resolved_page = normalize_page_param(page)
    service = MessageService(db)
    items, total = await service.list_messages(
        str(discussion_id),
        actor_type=actor.actor_type,
        actor_id=actor.actor_id,
        current_user=actor.user,
        page=resolved_page,
        size=size,
    )
    return page_response(items, total=total, page=resolved_page, size=size)


@router.put("/{discussion_id}/messages/lus")
async def marquer_lus(
    discussion_id: uuid.UUID,
    db: AsyncSession = Depends(get_async_session),
    actor=Depends(get_current_actor),
):
    service = MessageService(db)
    await service.marquer_lu(
        str(discussion_id),
        actor_type=actor.actor_type,
        actor_id=actor.actor_id,
        current_user=actor.user,
    )
    return api_response(None, message="Messages marqués comme lus")
