from __future__ import annotations
from datetime import datetime
from pydantic import BaseModel, EmailStr


# ── Auth ──────────────────────────────────────────────────────────────────────

class UserCreate(BaseModel):
    username: str
    email: EmailStr
    password: str

class UserOut(BaseModel):
    id: str
    username: str
    email: str
    created_at: datetime
    model_config = {"from_attributes": True}

class Token(BaseModel):
    access_token: str
    token_type: str = "bearer"


# ── Project ───────────────────────────────────────────────────────────────────

class ProjectCreate(BaseModel):
    name: str
    description: str = ""
    is_public: bool = False

class ProjectUpdate(BaseModel):
    name: str | None = None
    description: str | None = None
    is_public: bool | None = None

class ProjectOut(BaseModel):
    id: str
    owner_id: str
    name: str
    description: str
    is_public: bool
    updated_at: datetime
    model_config = {"from_attributes": True}

class InviteMember(BaseModel):
    username: str
    role: str = "viewer"   # editor | viewer


# ── Song ──────────────────────────────────────────────────────────────────────

class SongCreate(BaseModel):
    title: str
    artist: str = ""
    local_path: str = ""
    bpm: int = 0
    duration_sec: int = 0

class SongOut(BaseModel):
    id: str
    owner_id: str
    title: str
    artist: str
    local_path: str
    bpm: int
    duration_sec: int
    synced_at: datetime
    dances: list[SongDanceOut] = []
    model_config = {"from_attributes": True}


# ── Dance ─────────────────────────────────────────────────────────────────────

class SongDanceCreate(BaseModel):
    dance_name: str
    dance_order: int = 1

class SongDanceOut(BaseModel):
    id: str
    dance_name: str
    dance_order: int
    model_config = {"from_attributes": True}

class DanceAlternativeCreate(BaseModel):
    alt_song_dance_id: str
    note: str = ""

class DanceAlternativeOut(BaseModel):
    id: str
    song_dance_id: str
    alt_song_dance_id: str
    note: str
    model_config = {"from_attributes": True}


# ── ProjectSong ───────────────────────────────────────────────────────────────

class ProjectSongAdd(BaseModel):
    song_id: str
    position: int | None = None   # None = tilføj sidst

class ProjectSongStatusUpdate(BaseModel):
    status: str   # pending | playing | played | skipped

class ProjectSongOut(BaseModel):
    id: str
    song_id: str
    position: int
    status: str
    song: SongOut
    model_config = {"from_attributes": True}


SongOut.model_rebuild()
