import uuid
from datetime import datetime
from typing import Optional

from pydantic import BaseModel, ConfigDict, Field


# ── Tracked Links ───────────────────────────────────────────────────────────

class TrackedLinkCreate(BaseModel):
    activity_id: Optional[uuid.UUID] = None
    destination_url: str
    title: Optional[str] = Field(None, max_length=300)
    content_type: Optional[str] = Field(None, max_length=50)
    shared_in_channel: Optional[str] = Field(None, max_length=200)


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

    id: uuid.UUID
    activity_id: Optional[uuid.UUID] = None
    short_code: str
    destination_url: str
    title: Optional[str] = None
    content_type: Optional[str] = None
    shared_in_channel: Optional[str] = None
    shared_at: Optional[datetime] = None
    click_count: int
    is_active: bool
    created_at: datetime


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

    id: uuid.UUID
    tracked_link_id: uuid.UUID
    user_id: Optional[uuid.UUID] = None
    user_email: Optional[str] = None
    accessed_at: datetime
    user_agent: Optional[str] = None


# ── Quizzes ─────────────────────────────────────────────────────────────────

class QuizQuestion(BaseModel):
    question: str
    options: list[str]
    correct_index: int
    explanation: Optional[str] = None


class QuizCreate(BaseModel):
    activity_id: Optional[uuid.UUID] = None
    title: str = Field(..., max_length=300)
    description: Optional[str] = None
    passing_score_pct: int = Field(default=70, ge=0, le=100)
    questions: list[QuizQuestion]
    time_limit_minutes: Optional[int] = Field(None, ge=1)


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

    id: uuid.UUID
    activity_id: Optional[uuid.UUID] = None
    title: str
    description: Optional[str] = None
    passing_score_pct: int
    questions: list[QuizQuestion]
    time_limit_minutes: Optional[int] = None
    is_active: bool
    created_at: datetime

    def strip_answers(self) -> "QuizResponse":
        """Return a copy with correct_index removed from each question (for non-admin users)."""
        stripped_questions = [
            QuizQuestion(
                question=q.question,
                options=q.options,
                correct_index=-1,
                explanation=None,
            )
            for q in self.questions
        ]
        return self.model_copy(update={"questions": stripped_questions})


class QuizSubmit(BaseModel):
    answers: list[int]


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

    id: uuid.UUID
    quiz_id: uuid.UUID
    user_id: uuid.UUID
    score_pct: int
    passed: bool
    xp_awarded: int
    completed_at: datetime
