from enum import StrEnum

from pydantic import BaseModel, ConfigDict, Field, model_validator
from src.__types.index import Unit


class AttentionSeverity(StrEnum):
    LOW = "low"
    MEDIUM = "medium"
    HIGH = "high"


class AttentionType(StrEnum):
    LAST_MONTH_USAGE = "last_month_usage"  # 前月使用量
    EXCEEDED = "exceeded"  # クォータ超過


class LastMonthUsageParameters(BaseModel):
    last_month_usage: Unit = Field(..., description="前月の使用量")


class Attention(BaseModel):
    """アテンション

    アテンションとは、『AIユニットの使用量に関しての注意喚起や警告』を意味する。
    前月の使用量から見る使用予測や、クォータ超過などをユーザーに伝える際に使用する。
    通知の種類に応じて、表示に必要な動的パラメータをparametersフィールドで管理する。
    """

    severity: AttentionSeverity = Field(..., description="重要度")
    type: AttentionType = Field(..., description="タイプ")
    parameters: LastMonthUsageParameters | None = Field(
        default=None,
        description="タイプに対応したパラメータ e.g. 前月使用量",
    )

    model_config = ConfigDict(
        json_schema_extra={
            "example": {
                "severity": "low",
                "type": "last_month_usage",
                "parameters": {
                    "last_month_usage": 10000,
                },
            },
        },
    )

    @model_validator(mode="after")
    def validate_parameters(self) -> "Attention":
        """typeとparametersの整合性を確認する"""
        if self.type == AttentionType.LAST_MONTH_USAGE and not isinstance(self.parameters, LastMonthUsageParameters):
            raise ValueError("parameters must be LastMonthUsageParameters for LAST_MONTH_USAGE type")
        if self.type == AttentionType.EXCEEDED and self.parameters is not None:
            raise ValueError("parameters must be None for EXCEEDED type")
        return self
