import uuid
from datetime import datetime
from typing import Any, Optional

from pydantic import BaseModel, ConfigDict, Field


# ── Activity ────────────────────────────────────────────────────────────────

class ActivityBase(BaseModel):
    title: str = Field(..., max_length=300)
    description: Optional[str] = None
    category: str = Field(..., max_length=50)
    platform: Optional[str] = Field(None, max_length=100)
    xp_value: int = Field(default=0, ge=0)
    xp_open_pct: int = Field(default=100, ge=0, le=100)
    estimated_duration_minutes: Optional[int] = Field(None, ge=0)
    difficulty: str = Field(default="beginner", max_length=20)
    is_mandatory: bool = False
    is_recurring: bool = False
    recurrence_period: Optional[str] = Field(None, max_length=20)
    trust_tier: int = Field(default=1, ge=1, le=3)
    tags: Optional[list[str]] = None


class ActivityCreate(ActivityBase):
    pass


class ActivityUpdate(BaseModel):
    title: Optional[str] = Field(None, max_length=300)
    description: Optional[str] = None
    category: Optional[str] = Field(None, max_length=50)
    platform: Optional[str] = Field(None, max_length=100)
    xp_value: Optional[int] = Field(None, ge=0)
    xp_open_pct: Optional[int] = Field(None, ge=0, le=100)
    estimated_duration_minutes: Optional[int] = Field(None, ge=0)
    difficulty: Optional[str] = Field(None, max_length=20)
    is_mandatory: Optional[bool] = None
    is_recurring: Optional[bool] = None
    recurrence_period: Optional[str] = Field(None, max_length=20)
    trust_tier: Optional[int] = Field(None, ge=1, le=3)
    tags: Optional[list[str]] = None
    is_active: Optional[bool] = None


class ActivityResponse(ActivityBase):
    model_config = ConfigDict(from_attributes=True)

    id: uuid.UUID
    is_active: bool
    quiz_id: Optional[uuid.UUID] = None
    created_at: datetime
    completions_count: Optional[int] = None


# ── Completion ──────────────────────────────────────────────────────────────

class CompletionBase(BaseModel):
    activity_id: uuid.UUID
    status: str = Field(default="not_started", max_length=30)
    progress_pct: int = Field(default=0, ge=0, le=100)
    evidence_url: Optional[str] = None
    source: str = Field(default="manual", max_length=50)
    trust_tier: int = Field(default=3, ge=1, le=3)


class CompletionCreate(BaseModel):
    user_id: uuid.UUID
    activity_id: uuid.UUID
    status: str = Field(default="completed", max_length=30)
    source: Optional[str] = Field(default="manual", max_length=50)
    trust_tier: Optional[int] = Field(default=3, ge=1, le=3)
    evidence_url: Optional[str] = None
    period_key: Optional[str] = Field(None, max_length=20)


class CompletionUpdate(BaseModel):
    status: Optional[str] = Field(None, max_length=30)
    progress_pct: Optional[int] = Field(None, ge=0, le=100)
    evidence_url: Optional[str] = None
    verification_note: Optional[str] = None


class CompletionResponse(BaseModel):
    model_config = ConfigDict(from_attributes=True)

    id: uuid.UUID
    user_id: uuid.UUID
    user_name: Optional[str] = None
    activity_id: uuid.UUID
    activity_title: Optional[str] = None
    status: str
    progress_pct: int
    started_at: Optional[datetime] = None
    completed_at: Optional[datetime] = None
    xp_awarded: int
    source: str
    trust_tier: int
    period_key: Optional[str] = None
    flagged_reason: Optional[str] = None
    evidence_url: Optional[str] = None
    created_at: datetime


# ── XP Events (returned after completion processing) ───────────────────────

class XPEvent(BaseModel):
    event_type: str  # "xp_awarded" | "level_up" | "badge_earned"
    data: dict[str, Any]


class CompletionResult(BaseModel):
    completion: CompletionResponse
    events: list[XPEvent] = []
