"""Lead score bands and the score -> status mapping."""

from __future__ import annotations

from dataclasses import dataclass

from app.models.enums import LeadStatus


@dataclass(frozen=True, slots=True)
class ScoreBand:
    status: LeadStatus
    label: str
    minimum: int
    maximum: int
    color: str

    def contains(self, score: int) -> bool:
        return self.minimum <= score <= self.maximum


#: Ordered from coldest to hottest. Bands are inclusive and cover 0-100 with no gaps.
SCORE_BANDS: tuple[ScoreBand, ...] = (
    ScoreBand(LeadStatus.COLD, "Cold", 0, 39, "slate"),
    ScoreBand(LeadStatus.WARM, "Warm", 40, 69, "amber"),
    ScoreBand(LeadStatus.QUALIFIED, "Qualified", 70, 84, "sky"),
    ScoreBand(LeadStatus.HOT, "Hot", 85, 100, "emerald"),
)


def band_for_score(score: int) -> ScoreBand:
    for band in SCORE_BANDS:
        if band.contains(score):
            return band
    return SCORE_BANDS[-1] if score > 100 else SCORE_BANDS[0]


def status_for_score(score: int, rejected: bool = False) -> LeadStatus:
    """Map a 0-100 score to a lead status. A rejected lead is always REJECTED."""
    if rejected:
        return LeadStatus.REJECTED
    return band_for_score(score).status


def is_qualified(score: int, rejected: bool, min_score: int = 70) -> bool:
    """A lead qualifies when it is not rejected and clears the campaign threshold."""
    return not rejected and score >= min_score


def band_summary() -> list[dict[str, object]]:
    return [
        {
            "status": band.status.value,
            "label": band.label,
            "min": band.minimum,
            "max": band.maximum,
            "color": band.color,
        }
        for band in SCORE_BANDS
    ]
