from pydantic import BaseModel, Field
from typing import Optional


# ─── Anchor ─────────────────────────────────────────────────────────────────────

class AnchorCredentialRequest(BaseModel):
    numero_serie:       str = Field(..., description="Numéro de série du credential (ex: UAC-2022-00001-XXXX)")
    etablissement_slug: str = Field(..., description="Slug de l'établissement émetteur")
    titulaire_email:    str = Field(..., description="Email du titulaire")
    type:               str = Field(..., description="Type de credential (licence, master…)")
    intitule:           str = Field(..., description="Intitulé du credential")
    mention:            Optional[str] = Field(None, description="Mention obtenue")
    date_emission:      str = Field(..., description="Date d'émission (YYYY-MM-DD)")
    annee_academique:   Optional[str] = Field(None, description="Année académique (ex: 2021-2022)")


class AnchorCredentialResponse(BaseModel):
    hash:         str = Field(..., description="Hash SHA-256 du credential (hex 64 chars)")
    tx_hash:      str = Field(..., description="Hash de la transaction Polygon")
    block_number: int = Field(..., description="Numéro de bloc")
    anchored:     bool = True


# ─── Replace ─────────────────────────────────────────────────────────────────────

class ReplaceCredentialRequest(BaseModel):
    old_hash:           str = Field(..., min_length=64, max_length=64, description="Hash du credential original")
    numero_serie:       str = Field(..., description="Numéro de série du credential correctif")
    etablissement_slug: str = Field(..., description="Slug de l'établissement")
    titulaire_email:    str = Field(..., description="Email du titulaire")
    type:               str = Field(..., description="Type du credential correctif")
    intitule:           str = Field(..., description="Intitulé du credential correctif")
    mention:            Optional[str] = Field(None)
    date_emission:      str = Field(..., description="Date d'émission (YYYY-MM-DD)")
    annee_academique:   Optional[str] = Field(None)


class ReplaceCredentialResponse(BaseModel):
    old_hash:     str
    new_hash:     str
    tx_hash:      str
    block_number: int
    replaced:     bool = True


# ─── Verify ──────────────────────────────────────────────────────────────────────

class VerifyCredentialResponse(BaseModel):
    hash:          str
    anchored:      bool
    replaced:      bool = False
    replaced_by:   Optional[str] = None   # hash hex du correctif
    anchored_at:   Optional[int] = None   # timestamp Unix
    numero_serie:  Optional[str] = None
    message:       str = ""


# ─── Legacy (conservés pour compatibilité) ───────────────────────────────────────

class EmitDiplomaRequest(BaseModel):
    certificate_number: str
    student_name: str
    degree_title: str
    university: str
    issued_at: str
    university_wallet: Optional[str] = None


class EmitDiplomaResponse(BaseModel):
    hash: str
    transaction_id: str
    block_number: int
    verified: bool = True


class VerifyDiplomaResponse(BaseModel):
    verified: bool
    hash: str
    issued_by: Optional[str] = None
    issued_at: Optional[int] = None
    revoked: bool = False
    certificate_number: Optional[str] = None
    message: str = ""


class RegisterUniversityRequest(BaseModel):
    wallet_address: str
    name: str


class RegisterUniversityResponse(BaseModel):
    transaction_id: str
    wallet_address: str
    name: str
    success: bool
