"""All request/response schemas for the admin panel."""
from datetime import datetime
from typing import Optional

from pydantic import BaseModel, EmailStr, Field, ConfigDict


# ============================================================
# Admin auth
# ============================================================
class AdminLogin(BaseModel):
    username: str
    password: str


class AdminOut(BaseModel):
    model_config = ConfigDict(from_attributes=True)
    id: int
    name: str
    username: str


# ============================================================
# State
# ============================================================
class StateCreate(BaseModel):
    name: str = Field(..., min_length=1, max_length=100)


class StateOut(BaseModel):
    model_config = ConfigDict(from_attributes=True)
    id: int
    name: str
    created_at: datetime | None = None


# ============================================================
# District
# ============================================================
class DistrictCreate(BaseModel):
    name: str = Field(..., min_length=1, max_length=100)
    state_id: int


class DistrictOut(BaseModel):
    model_config = ConfigDict(from_attributes=True)
    id: int
    name: str
    state_id: int
    created_at: datetime | None = None  


# ============================================================
# Center
# ============================================================
class CenterCreate(BaseModel):
    name: str = Field(..., min_length=1, max_length=100)
    district_id: int
    address: str | None = None


class CenterOut(BaseModel):
    model_config = ConfigDict(from_attributes=True)
    id: int
    name: str
    address: str | None = None
    district_id: int
    created_at: datetime | None = None


# ============================================================
# Doctor
# ============================================================
class DoctorCreate(BaseModel):
    full_name: str = Field(..., min_length=1, max_length=100)
    email: EmailStr
    mobile_number: str = Field(..., min_length=6, max_length=15)
    gender: str | None = None
    age: int | None = Field(default=None, ge=0, le=120)
    specialization: str | None = None
    address: str | None = None
    center_id: int

    # credentials the admin sets for the doctor
    username: str = Field(..., min_length=3, max_length=50)
    password: str = Field(..., min_length=6, max_length=72)


class DoctorOut(BaseModel):
    model_config = ConfigDict(from_attributes=True)
    id: int
    full_name: str
    email: EmailStr
    mobile_number: str
    gender: str | None = None
    age: int | None = None
    specialization: str | None = None
    address: str | None = None
    username: str
    center_id: int
    is_active: bool
    created_at: datetime | None = None
    # NOTE: password is intentionally never returned.


# ============================================================
# Doctor login (mobile app)
# ============================================================
class DoctorLogin(BaseModel):
    username: str
    password: str


class DoctorLoginOut(BaseModel):
    model_config = ConfigDict(from_attributes=True)
    id: int
    full_name: str
    username: str
    email: EmailStr
    specialization: str | None = None
    center_id: int
    center_name: str | None = None


# ============================================================
# Patient
# ============================================================
class PatientCreate(BaseModel):
    doctor_id: int
    full_name: str = Field(..., min_length=1, max_length=100)
    father_husband_name: str | None = None
    age: int | None = Field(default=None, ge=0, le=120)
    gender: str | None = None
    marital_status: str | None = None
    mobile_number: str | None = Field(default=None, max_length=15)
    address: str | None = None


class PatientOut(BaseModel):
    model_config = ConfigDict(from_attributes=True)
    id: int
    doctor_id: int
    full_name: str
    father_husband_name: str | None = None
    age: int | None = None
    gender: str | None = None
    marital_status: str | None = None
    mobile_number: str | None = None
    address: str | None = None
    created_at: datetime | None = None
    doctor_name: str | None = None   # filled by admin endpoints; ignored by mobile


# ============================================================
# Measurement (a BLE reading saved for a patient)
# ============================================================
class MeasurementCreate(BaseModel):
    test_type: str = Field(..., min_length=1, max_length=40)
    value: str = Field(..., min_length=1, max_length=40)
    unit: str | None = None
    pulse: str | None = None
    status: str | None = None
    device_name: str | None = None
    latitude: float | None = None
    longitude: float | None = None


class MeasurementOut(BaseModel):
    model_config = ConfigDict(from_attributes=True)
    id: int
    patient_id: int
    test_type: str
    value: str
    unit: str | None = None
    pulse: str | None = None
    status: str | None = None
    device_name: str | None = None
    latitude: float | None = None
    longitude: float | None = None
    created_at: datetime | None = None


# ============================================================
# Dashboard
# ============================================================
class DashboardStats(BaseModel):
    total_states: int     
    total_districts: int
    total_centers: int
    total_doctors: int
    total_patients: int

