"""Utility helpers to build Q-Table states from negotiation snapshots (Version 3.0)."""

from __future__ import annotations

from dataclasses import dataclass
from typing import Optional

from ..model.state import (
    AcceptanceRate,
    DistributionStructure,
    InputPriceZone,
    PartnerType,
    RevenueRange,
    State,
)


@dataclass(frozen=True)
class NegotiationSnapshot:
    """협상 스냅샷 - 실제 비즈니스 데이터"""

    # 매출액 (만원 단위)
    revenue_amount: float

    # 유통 구조 코드 ("M": 제조, "W": 총판, "R": 유통)
    distribution_code: str

    # 파트너사 수
    partner_count: int

    # 가격 정보
    anchor_price: float
    target_price: float
    input_price: float

    # 가격 수용률 (0~1, 계산되거나 직접 입력)
    acceptance_ratio: Optional[float] = None

    # 초기 가격 (수용률 계산용, acceptance_ratio가 없을 때)
    initial_price: Optional[float] = None


def build_state(snapshot: NegotiationSnapshot) -> State:
    """
    협상 스냅샷으로부터 Q-Learning State 생성 (Version 3.0)

    Args:
        snapshot: 협상 스냅샷

    Returns:
        162-dimensional state
    """
    # 1. 매출액 가격구간
    revenue_range = RevenueRange.from_amount(snapshot.revenue_amount)

    # 2. 유통 구조
    distribution = DistributionStructure.from_code(snapshot.distribution_code)

    # 3. 파트너사 종류
    partner_type = PartnerType.from_count(snapshot.partner_count)

    # 4. 가격 수용률 구간
    if snapshot.acceptance_ratio is not None:
        acceptance_rate = AcceptanceRate.from_ratio(snapshot.acceptance_ratio)
    elif snapshot.initial_price is not None:
        # 초기가격으로부터 수용률 계산: (initial - input) / initial
        if snapshot.initial_price <= 0:
            raise ValueError("initial_price must be positive")
        ratio = (snapshot.initial_price - snapshot.input_price) / snapshot.initial_price
        acceptance_rate = AcceptanceRate.from_ratio(ratio)
    else:
        raise ValueError("Either acceptance_ratio or initial_price must be provided")

    # 5. 입력 금액 구간
    input_price_zone = InputPriceZone.from_prices(
        input_price=snapshot.input_price,
        anchor_price=snapshot.anchor_price,
        target_price=snapshot.target_price,
    )

    return State(
        revenue_range=revenue_range,
        distribution=distribution,
        partner_type=partner_type,
        acceptance_rate=acceptance_rate,
        input_price_zone=input_price_zone,
    )
