"""
시간 표시 헬퍼.

여러 모듈에서 `f"{h}시간 {m}분"` 패턴을 중복하던 것을 단일 함수로.
"""
from __future__ import annotations


def format_hours_minutes(total_minutes: int, *, omit_zero_minutes: bool = False) -> str:
    """분을 "X시간 Y분" 형식으로.

    Args:
        total_minutes: 총 분 (음수 가능 — 절댓값 표시)
        omit_zero_minutes: True면 "X시간"처럼 0분 생략

    Examples:
        >>> format_hours_minutes(90)
        '1시간 30분'
        >>> format_hours_minutes(60, omit_zero_minutes=True)
        '1시간'
        >>> format_hours_minutes(45)
        '0시간 45분'
        >>> format_hours_minutes(45, omit_zero_minutes=True)
        '45분'
    """
    minutes = abs(int(total_minutes))
    h, m = divmod(minutes, 60)
    if omit_zero_minutes:
        if h == 0:
            return f"{m}분"
        if m == 0:
            return f"{h}시간"
    return f"{h}시간 {m}분"


def format_leave_amount(days: float, work_minutes: int) -> tuple:
    """연차 일수를 (완전한 일수, 나머지 분)으로 분해.

    `int(days * 8)`로 시간만 뽑던 표시가 30분 연차(0.0625일)를 "0시간"으로
    삼켜버리던 문제를 막는다. 환산 기준은 DB 정본과 동일한 work_minutes
    (`Database.get_leave_minutes_for`가 `days * get_work_minutes()`를 쓴다) —
    단축근무 7h30m 사용자의 반차는 4시간이 아니라 3시간 45분이다.

    Args:
        days: 연차 일수 (1.0 / 0.5 / 0.25 / 0.0625 …)
        work_minutes: 1일 근무 분 (기본 480)

    Returns:
        (일수, 나머지 분) — 예: 480분 기준 1.5일 → (1, 240), 0.0625일 → (0, 30)
    """
    unit = int(work_minutes) if work_minutes and work_minutes > 0 else 480
    total_minutes = int(round(float(days) * unit))
    return divmod(total_minutes, unit)


if __name__ == '__main__':
    # 표준 8시간(480분) 기준
    assert format_leave_amount(0.0625, 480) == (0, 30), '30분 연차'
    assert format_leave_amount(0.125, 480) == (0, 60), '1시간 연차'
    assert format_leave_amount(0.25, 480) == (0, 120), '반반차'
    assert format_leave_amount(0.5, 480) == (0, 240), '반차'
    assert format_leave_amount(1.0, 480) == (1, 0), '종일'
    assert format_leave_amount(1.5, 480) == (1, 240), '1.5일'
    # 단축근무 7h30m(450분) — 반차는 3시간 45분
    assert format_leave_amount(0.5, 450) == (0, 225), '단축근무 반차'
    assert format_leave_amount(1.0, 450) == (1, 0), '단축근무 종일'
    # work_minutes 이상값은 480으로 폴백
    assert format_leave_amount(0.5, 0) == (0, 240), '0 폴백'
    assert format_hours_minutes(30, omit_zero_minutes=True) == '30분'
    print('format_leave_amount 자체 검사 통과')
