# -*- coding: utf-8 -*-
"""Enumerations defined by the NACEF cahier des charges (NACEF-CC-MDF-01, Partie 3).

Values are the exact string tokens exchanged with the S-MDF; do not localise them.
"""
from enum import Enum


class SMDFStatus(str, Enum):
    """``SMDFManifest.status`` — États possibles pour un S-MDF (CDC §I.2)."""

    FACTORY = "FACTORY"
    CERT_REQUESTED = "CERT_REQUESTED"
    SUSPENDED = "SUSPENDED"
    NOT_SYNCHRONIZED = "NOT_SYNCHRONIZED"
    MAINTENANCE = "MAINTENANCE"
    SYNCHRONIZED = "SYNCHRONIZED"
    SYNCHRONIZATION_IN_PROGRESS = "SYNCHRONIZATION_IN_PROGRESS"

    @property
    def can_sign(self) -> bool:
        """Only a SYNCHRONIZED S-MDF may sign tickets (CDC §I.4, E0302)."""
        return self is SMDFStatus.SYNCHRONIZED


class CertRequestStatus(str, Enum):
    """``SMDFManifest.certificateInfo.certRequestStatus`` — États d'une demande
    de certificat électronique (CDC §I.3)."""

    CREATED = "CREATED"
    PAIRING_VALIDATED = "PAIRING_VALIDATED"
    PHONE_VALIDATED = "PHONE_VALIDATED"
    PIN_VALIDATED = "PIN_VALIDATED"
    WAITING_CA = "WAITING_CA"
    CERTIFICATE_GENERATED = "CERTIFICATE_GENERATED"
    REJECTED = "REJECTED"
    AUTOMATICALLY_REJECTED = "AUTOMATICALLY_REJECTED"


class SMDFType(str, Enum):
    """``SMDFManifest.type`` — deployment flavour of the S-MDF (CDC §III.3)."""

    TERMINAL = "TERMINAL"
    SERVER = "SERVER"


class SMDFConnectionState(str, Enum):
    """``SMDFManifest.state`` — connectivity to the NACEF platform."""

    ONLINE = "Online"
    OFFLINE = "Offline"


class LogLevel(str, Enum):
    """``SICLogEntry.level`` — piste d'audit level (CDC §I.5 / E0903)."""

    INFO = "INFO"
    ERROR = "ERROR"


class OperationType(str, Enum):
    """Ticket ``operationType`` — type de facture (E0501)."""

    TICKET = "TICKET"        # Normal
    PROFORMA = "PROFORMA"
    REFUND = "REFUND"        # Remboursement
    DUPLICATE = "DUPLICATE"  # Copie ("Ticket copie", E0505)


class TransactionType(str, Enum):
    """Ticket ``transactionType`` — type de transaction (E0403)."""

    SALE = "SALE"
    TRAINING = "TRAINING"    # Formation (E1003)
