from datetime import datetime
import enum
from typing import Optional
from uuid import UUID
from pydantic import BaseModel

class FirmwareUpdateStatus(enum.Enum):
    CREATED = "xCreated"
    SUBMITTED = "xSubmitted"
    DOWNLOADED = "Downloaded"
    DOWNLOAD_FAILED = "DownloadFailed"
    DOWNLOADING = "Downloading"
    DOWNLOAD_SCHEDULED = "DownloadScheduled"
    DOWNLOAD_PAUSED = "DownloadPaused"
    IDLE = "Idle"
    INSTALLATION_FAILED = "InstallationFailed"
    INSTALLING = "Installing"
    INSTALLED = "Installed"
    INSTALL_REBOOTING = "InstallRebooting"
    INSTALL_SCHEDULED = "InstallScheduled"
    INSTALL_VERIFICATION_FAILED = "InstallVerificationFailed"
    INVALID_SIGNATURE = "InvalidSignature"
    SIGNATURE_VERIFIED = "SignatureVerified"

class FirmwareUpdateBase(BaseModel):
    retries: int
    retry_interval: int
    location: str
    retrieve_date_time: datetime
    install_date_time: Optional[datetime]
    signing_certificate: Optional[str]
    signature: Optional[str]

class FirmwareUpdate(FirmwareUpdateBase):
    id: UUID
    request_id: int
    status: FirmwareUpdateStatus

class FirmwareUpdateCreate(FirmwareUpdateBase):
    pass

class FirmwareUpdateSubmissionResponse(BaseModel):
    status: str