from typing import Literal

from pydantic import BaseModel, Field

from app.security import Role


class LoginRequest(BaseModel):
    username: str = Field(
        min_length=1,
        max_length=50,
        description="Kode pengguna / sales atau nama pengguna",
        examples=["U00001", "SLS001", "SUTONO"],
    )
    password: str = Field(
        min_length=1,
        max_length=100,
        description="Password akun",
    )
    device_name: str | None = Field(
        default=None,
        max_length=100,
        description="Nama perangkat/host client",
        examples=["Samsung SM-A525F", "PC-OFFICE"],
    )
    app_type: str | None = Field(
        default="ANDROID",
        max_length=20,
        description="Jenis aplikasi (ANDROID, WEB, WINDOWS, dll)",
        examples=["ANDROID", "WEB", "WINDOWS"],
    )
    app_version: str | None = Field(
        default=None,
        max_length=50,
        description="Versi aplikasi client",
        examples=["1.0.0"],
    )


class UserProfile(BaseModel):
    user_code: str = Field(description="Kode pengguna atau kode sales")
    user_name: str = Field(description="Nama pengguna")
    role: Role = Field(description="Role otorisasi API (VIEWER, SALES, SUPERVISOR, OWNER)")
    hak_akses: str = Field(description="Hak akses asli dari master data")
    kode_divisi: str | None = Field(default=None, description="Kode divisi jika terdaftar")
    source: Literal["PENGGUNA", "SALES"] = Field(
        description="Sumber akun pengguna (mspengguna atau mssales)"
    )
    kode_sales: str | None = Field(
        default=None,
        description="Kode salesman jika pengguna adalah sales",
    )


class LoginResponse(BaseModel):
    access_token: str = Field(description="Bearer JWT token untuk otorisasi request")
    token_type: str = Field(default="bearer", description="Tipe token autentikasi")
    expires_in: int = Field(description="Masa berlaku token dalam detik")
    user: UserProfile = Field(description="Profil pengguna yang sedang login")
    login_id: int | None = Field(
        default=None,
        description="ID sesi login pada tabel audit mslogin",
    )


class LogoutRequest(BaseModel):
    login_id: int | None = Field(
        default=None,
        description="ID sesi mslogin yang ingin diakhiri",
    )


class LogoutResponse(BaseModel):
    status: str = "ok"
    message: str = "Berhasil logout"
