"""Correct Jalali (Shamsi) date converter."""

def gregorian_to_jalali(gy, gm, gd):
    """Convert Gregorian date to Jalali. Returns (jy, jm, jd)."""
    g_days_in_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    j_days_in_month = [31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29]

    gy -= 1600
    gm -= 1
    gd -= 1

    g_day_no = 365 * gy + (gy + 3) // 4 - (gy + 99) // 100 + (gy + 399) // 400
    for i in range(gm):
        g_day_no += g_days_in_month[i]
    if gm > 1 and ((gy + 1600) % 4 == 0 and ((gy + 1600) % 100 != 0 or (gy + 1600) % 400 == 0)):
        g_day_no += 1
    g_day_no += gd

    j_day_no = g_day_no - 79

    j_np = j_day_no // 12053
    j_day_no %= 12053

    jy = 979 + 33 * j_np + 4 * (j_day_no // 1461)
    j_day_no %= 1461

    if j_day_no >= 366:
        jy += (j_day_no - 1) // 365
        j_day_no = (j_day_no - 1) % 365

    jm, jd = 0, 0
    for i in range(11):
        j_mi = j_days_in_month[i]
        if j_day_no >= j_mi:
            j_day_no -= j_mi
        else:
            jm = i + 1
            jd = j_day_no + 1
            break
    else:
        jm = 12
        jd = j_day_no + 1

    return jy, jm, jd


def today_jalali() -> str:
    """Returns today's date in Jalali format: YYYY/MM/DD"""
    from datetime import date
    d = date.today()
    jy, jm, jd = gregorian_to_jalali(d.year, d.month, d.day)
    return f"{jy}/{jm:02d}/{jd:02d}"


def format_jalali(jalali_str: str) -> str:
    """Format 1405/03/28 → ۲۸ / ۳ / ۱۴۰۵  (Persian numerals, no leading zeros)"""
    try:
        parts = jalali_str.split('/')
        jy, jm, jd = int(parts[0]), int(parts[1]), int(parts[2])
        def to_persian(n):
            return str(n).translate(str.maketrans('0123456789', '۰۱۲۳۴۵۶۷۸۹'))
        return f"{to_persian(jd)} / {to_persian(jm)} / {to_persian(jy)}"
    except Exception:
        return jalali_str
