from bojstat.enums import CacheMode as CacheMode, ConflictResolution as ConflictResolution, ConsistencyMode as ConsistencyMode, Format as Format, Lang as Lang, OutputOrder as OutputOrder
from dataclasses import dataclass, field
from pathlib import Path

PARSER_VERSION: str
NORMALIZER_VERSION: str
SCHEMA_VERSION: str
TOKEN_VERSION: int
ERROR_CATALOG_VERSION: str
DEFAULT_BASE_URL: str
DEFAULT_USER_AGENT: str

@dataclass(slots=True)
class RetryConfig:
    """再試行設定。

    Attributes:
        max_attempts: 最大試行回数。
        transport_max_attempts: 通信例外時の最大試行回数（未指定時はmax_attempts）。
        base_delay: 指数バックオフの基準秒。
        cap_delay: 待機上限秒。
        jitter_ratio: バックオフ待機のゆらぎ係数。
        retry_on_403: 403再試行を有効化するか。
        retry_on_403_max_attempts: 403時の最大試行回数。
    """
    max_attempts: int = ...
    transport_max_attempts: int | None = ...
    base_delay: float = ...
    cap_delay: float = ...
    jitter_ratio: float = ...
    retry_on_403: bool = ...
    retry_on_403_max_attempts: int = ...

@dataclass(slots=True)
class CacheConfig:
    """キャッシュ設定。

    Attributes:
        mode: キャッシュモード。
        dir: キャッシュディレクトリ。
        ttl_seconds: TTL秒。
        publish_window_start_hour: 更新窓開始時刻（JST時）。
        publish_window_start_minute: 更新窓開始時刻（JST分）。
        publish_window_grace_minutes: 更新窓許容分。
    """
    mode: CacheMode = ...
    dir: Path | None = ...
    ttl_seconds: int = ...
    publish_window_start_hour: int = ...
    publish_window_start_minute: int = ...
    publish_window_grace_minutes: int = ...

@dataclass(slots=True)
class ClientConfig:
    """クライアント共通設定。

    Attributes:
        base_url: APIベースURL。
        timeout: タイムアウト秒。
        lang: 言語。
        format: 出力形式。
        user_agent: User-Agent。
        rate_limit_per_sec: 1秒あたり上限回数。
        strict_api: 仕様準拠モード。
        auto_split_codes: 自動分割有効化。
        consistency_mode: 整合性モード。
        conflict_resolution: 競合解決。
        output_order: 出力順序。
        allow_raw_override: raw_params上書き許可。
        metadata_freshness_strict: DATE解析失敗時に例外化するか。
        capture_full_response: 完全文字列の例外保持。
        cache: キャッシュ設定。
    """
    base_url: str = ...
    timeout: float = ...
    lang: Lang = ...
    format: Format = ...
    user_agent: str = ...
    rate_limit_per_sec: float = ...
    strict_api: bool = ...
    auto_split_codes: bool = ...
    consistency_mode: ConsistencyMode = ...
    conflict_resolution: ConflictResolution = ...
    output_order: OutputOrder = ...
    allow_raw_override: bool = ...
    metadata_freshness_strict: bool = ...
    capture_full_response: bool = ...
    cache: CacheConfig = field(default_factory=CacheConfig)
