import json
import os
from datetime import datetime, timedelta

HOLIDAYS_FILE = "data/holidays.json"

# Global debug flag
DEBUG = False

def debug_print(*args, **kwargs):
    """Print debug messages only if debug mode is enabled."""
    if DEBUG:
        print(*args, **kwargs)

def set_debug_mode(debug):
    """Set the debug mode for this module."""
    global DEBUG
    DEBUG = debug

def load_holidays():
    """
    Načte seznam státních svátků ze souboru holidays.json.
    
    :return: Slovník, kde klíč je rok a hodnota je seznam svátků ve formátu DD.MM.
    """
    if not os.path.exists(HOLIDAYS_FILE):
        debug_print(f"Soubor se svátky {HOLIDAYS_FILE} neexistuje.")
        return {}
    
    try:
        with open(HOLIDAYS_FILE, 'r', encoding='utf-8') as f:
            holidays = json.load(f)
        return holidays
    except json.JSONDecodeError as e:
        debug_print(f"Chyba při čtení souboru se svátky: {e}")
        return {}

def is_holiday(date_str):
    """
    Zkontroluje, zda je zadané datum státní svátek v ČR.
    
    :param date_str: Datum ve formátu DD.MM.YYYY.
    :return: True pokud je svátek, jinak False.
    """
    try:
        dt = datetime.strptime(date_str, "%d.%m.%Y")
    except ValueError:
        debug_print(f"Neplatný formát data: {date_str}")
        return False
        
    holidays = load_holidays()
    year = dt.strftime("%Y")
    day_month = dt.strftime("%d.%m")
    
    if year in holidays and day_month in holidays[year]:
        return True
    return False

def is_weekend(date_str):
    """
    Zkontroluje, zda je zadané datum víkend (sobota nebo neděle).
    
    :param date_str: Datum ve formátu DD.MM.YYYY.
    :return: True pokud je víkend, jinak False.
    """
    try:
        dt = datetime.strptime(date_str, "%d.%m.%Y")
    except ValueError:
        debug_print(f"Neplatný formát data: {date_str}")
        return False
        
    # 5 = sobota, 6 = neděle
    return dt.weekday() in [5, 6]

def get_previous_working_day(date_str):
    """
    Vrátí předchozí pracovní den (ne svátek, ne víkend).
    
    :param date_str: Datum ve formátu DD.MM.YYYY.
    :return: Datum předchozího pracovního dne ve formátu DD.MM.YYYY, nebo None.
    """
    try:
        dt = datetime.strptime(date_str, "%d.%m.%Y")
    except ValueError:
        debug_print(f"Neplatný formát data: {date_str}")
        return None
    
    # Odečítáme dny, dokud nenajdeme pracovní den
    current_date = dt - timedelta(days=1)
    
    # Omezení na 10 dní zpět, abychom se nezacyklili
    for _ in range(10):
        date_str_check = current_date.strftime("%d.%m.%Y")
        if not is_holiday(date_str_check) and not is_weekend(date_str_check):
            return date_str_check
        current_date -= timedelta(days=1)
    
    # Pokud se nepodařilo najít pracovní den, vrátíme None
    return None

# Příklad použití
if __name__ == "__main__":
    debug_print("Státní svátky v roce 2025:")
    holidays = load_holidays()
    if "2025" in holidays:
        for holiday in holidays["2025"]:
            debug_print(f"  {holiday}")
    
    test_date = "01.05.2025"  # Svátek práce
    debug_print(f"\nDatum {test_date} je svátek: {is_holiday(test_date)}")
    debug_print(f"Datum {test_date} je víkend: {is_weekend(test_date)}")
    
    prev_workday = get_previous_working_day("01.05.2025")
    debug_print(f"Předchozí pracovní den před 01.05.2025: {prev_workday}")