"""Helpers for job experience year ranges."""
from __future__ import annotations

from jobs.models import Job

EXPERIENCE_YEAR_MAX = 15


def experience_year_plus_label() -> str:
    return f'{EXPERIENCE_YEAR_MAX}+ years'


def experience_year_label(years: int) -> str:
    if years == 1:
        return '1 year'
    if years >= EXPERIENCE_YEAR_MAX:
        return experience_year_plus_label()
    return f'{years} years'


def experience_year_choices(blank_label='Select years'):
    return [('', blank_label)] + [
        (year, experience_year_label(year))
        for year in range(EXPERIENCE_YEAR_MAX + 1)
    ]


def experience_year_field_choices():
    return [
        (year, experience_year_label(year))
        for year in range(EXPERIENCE_YEAR_MAX + 1)
    ]


def years_from_level(level: str) -> tuple[int, int]:
    mapping = {
        Job.ExperienceLevel.ENTRY: (0, 2),
        Job.ExperienceLevel.MID: (3, 5),
        Job.ExperienceLevel.SENIOR: (6, 9),
        Job.ExperienceLevel.EXECUTIVE: (10, EXPERIENCE_YEAR_MAX),
    }
    return mapping.get(level, (3, 5))


def level_from_years(min_years: int, max_years: int) -> str:
    midpoint = (min_years + max_years) / 2
    if midpoint <= 2:
        return Job.ExperienceLevel.ENTRY
    if midpoint <= 5:
        return Job.ExperienceLevel.MID
    if midpoint <= 9:
        return Job.ExperienceLevel.SENIOR
    return Job.ExperienceLevel.EXECUTIVE


def format_experience_display(min_years: int, max_years: int) -> str:
    if min_years == max_years:
        if min_years >= EXPERIENCE_YEAR_MAX:
            return experience_year_plus_label()
        return experience_year_label(min_years)
    if max_years >= EXPERIENCE_YEAR_MAX and min_years >= 10:
        return f'{min_years}+ years'
    return f'{min_years}–{max_years} years'
