from datetime import date, datetime
from typing import Optional, Any
from pydantic import BaseModel, Field
from .models import Answer, Severity, Status, Role

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

class LoginIn(BaseModel):
    email: str
    password: str

class UserCreate(BaseModel):
    email: str
    full_name: str
    role: Role
    password: str = Field(min_length=10)

class AssessmentUpdate(BaseModel):
    answer: Answer
    notes: str = ""
    owner_id: Optional[int] = None
    due_date: Optional[date] = None
    risk_level: Severity = Severity.medium
    remediation_status: Status = Status.open

class RiskCreate(BaseModel):
    title: str
    description: str
    control_id: Optional[int] = None
    severity: Severity = Severity.medium
    likelihood: int = Field(default=3, ge=1, le=5)
    owner_id: Optional[int] = None
    due_date: Optional[date] = None
    status: Status = Status.open
    remediation_plan: str = ""
    evidence_id: Optional[int] = None

class PolicyCreate(BaseModel):
    title: str
    category: str
    content: str
    owner_id: Optional[int] = None
    next_review_date: Optional[date] = None

class SupplierCreate(BaseModel):
    name: str
    criticality: Severity = Severity.medium
    contact_email: str = ""
    risk_score: int = 0
    review_date: Optional[date] = None
    notes: str = ""

class QuestionnaireCreate(BaseModel):
    customer_name: str
    title: str
    questions: list[dict[str, Any]] = []

class AIPrompt(BaseModel):
    prompt: str
    related_control: Optional[str] = None

class DashboardOut(BaseModel):
    cyber_readiness_score: int
    cmmc_nist_readiness_score: int
    open_risks: int
    missing_evidence: int
    upcoming_reviews: int
    questionnaire_completion_status: int
    policy_acknowledgement_status: int
    disclaimer: str
