from ninja import Router
from typing import List, Optional
from uuid import UUID
from datetime import datetime

from core.exceptions import UnauthorizedException
from core.middleware import get_tenant_id

router = Router(tags=["Client Portal"])


@router.get("/health")
def health(request):
    return {"status": "ok"}


@router.get("/account/me")
def get_current_account(request):
    tenant_id = get_tenant_id(request)
    if tenant_id is None:
        raise UnauthorizedException("Not authenticated.")

    from ..modules.authentication.models import ClientPortalUser

    membership = ClientPortalUser.objects.filter(
        tenant_id=tenant_id
    ).select_related("client_account", "user").first()

    if not membership or not membership.is_active:
        raise UnauthorizedException("Client account not found or inactive.")

    from ..modules.authentication.models import ClientAccount

    account = ClientAccount.objects.filter(
        tenant_id=tenant_id, id=membership.client_account_id
    ).first()

    return {
        "client_account_id": account.id,
        "name": account.name,
        "email": account.email,
        "phone": account.phone,
        "logo_url": account.logo_url,
        "user_id": membership.user.id,
        "role": membership.role,
        "is_active": membership.is_active,
    }


@router.get("/transactions")
def list_transactions(request):
    tenant_id = get_tenant_id(request)
    if tenant_id is None:
        raise UnauthorizedException("Not authenticated.")

    from ..modules.authentication.models import ClientPortalUser
    from ..modules.authentication.models import ClientTransaction

    membership = ClientPortalUser.objects.filter(
        tenant_id=tenant_id
    ).select_related("client_account").first()

    if not membership or not membership.is_active:
        raise UnauthorizedException("Client account not found or inactive.")

    transactions = ClientTransaction.objects.filter(
        tenant_id=tenant_id,
        client_account=membership.client_account,
    ).order_by("-created_at")[:50]

    return [
        {
            "id": tx.id,
            "transaction_type": tx.transaction_type,
            "transaction_ref": tx.transaction_ref,
            "title": tx.title,
            "description": tx.description,
            "status": tx.status,
            "origin": tx.origin,
            "destination": tx.destination,
            "carrier": tx.carrier,
            "voyage_number": tx.voyage_number,
            "estimated_delivery": tx.estimated_delivery.isoformat() if tx.estimated_delivery else None,
            "actual_delivery": tx.actual_delivery.isoformat() if tx.actual_delivery else None,
            "tracking_url": tx.tracking_url,
            "created_at": tx.created_at.isoformat(),
            "updated_at": tx.updated_at.isoformat(),
        }
        for tx in transactions
    ]


@router.get("/transactions/{tx_id}/details")
def get_transaction_details(request, tx_id: UUID):
    tenant_id = get_tenant_id(request)
    if tenant_id is None:
        raise UnauthorizedException("Not authenticated.")

    from ..modules.authentication.models import ClientPortalUser
    from ..modules.authentication.models import ClientTransaction

    membership = ClientPortalUser.objects.filter(
        tenant_id=tenant_id
    ).select_related("client_account").first()

    if not membership or not membership.is_active:
        raise UnauthorizedException("Client account not found or inactive.")

    transaction = ClientTransaction.objects.filter(
        tenant_id=tenant_id,
        client_account=membership.client_account,
        id=tx_id,
    ).first()

    if not transaction:
        raise UnauthorizedException("Transaction not found.")

    events = list(
        transaction.tracking_events.order_by("event_date")[:50].values(
            "id", "event_type", "location", "description",
            "event_date"
        )
    )

    return {
        "id": transaction.id,
        "transaction_type": transaction.transaction_type,
        "transaction_ref": transaction.transaction_ref,
        "title": transaction.title,
        "description": transaction.description,
        "status": transaction.status,
        "origin": transaction.origin,
        "destination": transaction.destination,
        "carrier": transaction.carrier,
        "voyage_number": transaction.voyage_number,
        "estimated_delivery": transaction.estimated_delivery.isoformat() if transaction.estimated_delivery else None,
        "actual_delivery": transaction.actual_delivery.isoformat() if transaction.actual_delivery else None,
        "tracking_url": transaction.tracking_url,
        "created_at": transaction.created_at.isoformat(),
        "updated_at": transaction.updated_at.isoformat(),
        "tracking_events": events,
    }
