"""
Date range formatter — converts 5 raw date fields into a single French display string.

The generated CV is always in French regardless of UI language.
"""

from typing import Optional

# French months (indexed 1-12; index 0 unused)
_MONTHS = [
    "", "Janv", "Févr", "Mars", "Avr", "Mai", "Juin",
    "Juil", "Août", "Sept", "Oct", "Nov", "Déc"
]

_PRESENT = "Présent"


def _format_single_date(year: Optional[int], month: Optional[int]) -> str:
    """Format one end of a date range. Returns '' if year is None."""
    if year is None:
        return ""
    if month is not None and 1 <= month <= 12:
        return f"{_MONTHS[month]} {year}"
    return str(year)


def format_date_range(
    year_start: Optional[int],
    month_start: Optional[int],
    year_end: Optional[int],
    month_end: Optional[int],
    is_present: bool = False,
) -> str:
    """
    Build a display string like "Janv 2018 - Présent" or "2012 - 2018".

    Rules:
    - If year_start is None → returns "" (caller should hide the date row)
    - is_present=True overrides year_end and renders "Présent"
    - Month is only shown if provided AND in range [1..12]
    - Always French output
    """
    start = _format_single_date(year_start, month_start)
    if not start:
        return ""

    if is_present:
        return f"{start} - {_PRESENT}"

    end = _format_single_date(year_end, month_end)
    if not end:
        return start

    return f"{start} - {end}"
