import datetime
from django.utils import timezone
from django.utils.dateparse import parse_date


def get_financial_year_info(dt=None):
    """
    Returns comprehensive financial year metadata for a given date or datetime (defaults to now).
    
    Trust Financial Year Cycle:
    - Starts on 31st July of year YYYY (e.g., 2026-07-31)
    - Ends on 30th July of year YYYY+1 (e.g., 2027-07-30)
    - Example: 31st July 2026 to 30th July 2027 represents FY 2026-27 (display: 2026 - 2027).
    """
    if dt is None:
        dt = timezone.now().date()
    elif isinstance(dt, datetime.datetime):
        dt = dt.date()
    elif isinstance(dt, str):
        parsed = parse_date(dt)
        if parsed:
            dt = parsed
        else:
            try:
                dt = datetime.datetime.fromisoformat(dt).date()
            except Exception:
                raise ValueError(f"Invalid date string: {dt}")

    # Trust financial year starts on July 31st (Month 7, Day 31)
    is_new_fy = (dt.month > 7) or (dt.month == 7 and dt.day >= 31)
    start_year = dt.year if is_new_fy else dt.year - 1
    end_year = start_year + 1

    start_date = datetime.date(start_year, 7, 31)
    end_date = datetime.date(end_year, 7, 30)

    end_short = str(end_year)[-2:]
    start_short = str(start_year)[-2:]

    return {
        'start_year': start_year,
        'end_year': end_year,
        'start_date': start_date,
        'end_date': end_date,
        'fiscal_year_str': f"{start_year}-{end_short}",     # e.g. "2026-27"
        'full_year_str': f"{start_year}-{end_year}",        # e.g. "2026-2027"
        'short_year_str': f"{start_short}-{end_short}",     # e.g. "26-27"
        'display_str': f"{start_year} - {end_year}",        # e.g. "2026 - 2027"
    }


def get_current_financial_year():
    """
    Returns the financial year metadata for today's date.
    """
    return get_financial_year_info()


def get_fiscal_year_string(dt=None):
    """
    Return the fiscal-year label for *dt* (defaults to now).
    Format: 'YYYY-YY' (e.g., '2026-27')
    """
    return get_financial_year_info(dt)['fiscal_year_str']


def get_financial_year_range(dt=None):
    """
    Given a date or datetime object (defaults to now),
    returns (start_date, end_date) as datetime.date objects for the trust financial year.
    (31st July of start_year to 30th July of end_year).
    """
    info = get_financial_year_info(dt)
    return info['start_date'], info['end_date']


def get_fiscal_year_display(financial_year=None):
    """
    Returns formatted display string for reports.
    - If financial_year is given (e.g. '2026-27' or '26-27'): returns '2026 - 2027'
    - If financial_year is 'all': returns 'அனைத்து நிதி ஆண்டுகள்'
    - If financial_year is None: returns current financial year display (e.g. '2026 - 2027')
    """
    if financial_year and financial_year != 'all':
        parts = financial_year.split('-')
        if len(parts) == 2:
            s_yr = f"20{parts[0]}" if len(parts[0]) == 2 else parts[0]
            e_yr = f"20{parts[1]}" if len(parts[1]) == 2 else parts[1]
            return f"{s_yr} - {e_yr}"
        return str(financial_year)
    elif financial_year == 'all':
        return "அனைத்து நிதி ஆண்டுகள்"
    else:
        return get_current_financial_year()['display_str']
