#!/usr/bin/env python3

import argparse
import sys
import os
from datetime import datetime

# Přidání adresáře src do sys.path, aby bylo možné importovat moduly
sys.path.insert(0, os.path.join(os.path.dirname(__file__)))

import data_fetcher
import database
import rate_finder
import rate_reporter
import holidays

# 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 check_and_update_yearly_data():
    """
    Zkontroluje konzistenci ročních dat pro aktuální rok a případně je aktualizuje.
    """
    current_year = datetime.now().year
    debug_print(f"Kontroluji konzistenci ročních dat pro rok {current_year}...")
    
    # Nastavíme debug mód pro všechny moduly
    database.set_debug_mode(DEBUG)
    data_fetcher.set_debug_mode(DEBUG)
    holidays.set_debug_mode(DEBUG)
    rate_finder.set_debug_mode(DEBUG)
    rate_reporter.set_debug_mode(DEBUG)
    
    # Zkontrolujeme konzistenci dat
    is_consistent = data_fetcher.check_yearly_data_consistency(current_year, output_dir="data")
    
    if not is_consistent:
        debug_print(f"Roční data pro rok {current_year} nejsou konzistentní. Stahuji aktualizovaná data...")
        # Ujistěme se, že adresář data existuje
        os.makedirs("data", exist_ok=True)
        # Stáhneme roční data znovu
        data_fetcher.download_yearly_data(current_year, output_dir="data", force=True)
    else:
        debug_print(f"Roční data pro rok {current_year} jsou aktuální.")

def main():
    global DEBUG
    
    # Inicializace databáze
    database.init_db()
    
    parser = argparse.ArgumentParser(description="Stahování a správa kurzů měn z ČNB.")
    parser.add_argument(
        "--year",
        type=int,
        help="Rok, pro který se mají stáhnout data (např. 2020)."
    )
    parser.add_argument(
        "-c", "--currency",
        type=str,
        help="Kód měny (např. USD) pro měsíční stahování, vyhledání kurzu nebo generování reportu."
    )
    parser.add_argument(
        "--start-date",
        type=str,
        help="Počáteční datum pro měsíční stahování nebo generování reportu ve formátu DD.MM.YYYY."
    )
    parser.add_argument(
        "--end-date",
        type=str,
        help="Koncové datum pro měsíční stahování nebo generování reportu ve formátu DD.MM.YYYY."
    )
    parser.add_argument(
        "--date",
        type=str,
        help="Datum pro stažení denních kurzů ve formátu DD.MM.YYYY."
    )
    parser.add_argument(
        "--get-rate",
        type=str,
        help="Vyhledá kurz pro zadané datum. Formát: DD.MM.YYYY"
    )
    parser.add_argument(
        "--auto-download",
        action="store_true",
        help="Automaticky stáhne denní data, pokud je po 14:30 a kurz pro dnešní datum není k dispozici."
    )
    parser.add_argument(
        "--report-year",
        type=int,
        help="Rok, pro který se má vygenerovat report kurzů."
    )
    parser.add_argument(
        "--report-month",
        type=int,
        help="Měsíc, pro který se má vygenerovat report kurzů (1-12). Vyžaduje --report-year."
    )
    parser.add_argument(
        "--report-period",
        nargs=2,
        metavar=('START_DATE', 'END_DATE'),
        help="Období, pro které se má vygenerovat report kurzů. Formát: DD.MM.YYYY DD.MM.YYYY"
    )
    parser.add_argument(
        "--debug",
        action="store_true",
        help="Zobrazí podrobné ladicí informace."
    )

    args = parser.parse_args()
    
    # Nastavíme debug mód
    DEBUG = args.debug
    
    # Nastavíme debug mód pro všechny moduly
    database.set_debug_mode(DEBUG)
    data_fetcher.set_debug_mode(DEBUG)
    holidays.set_debug_mode(DEBUG)
    rate_finder.set_debug_mode(DEBUG)
    rate_reporter.set_debug_mode(DEBUG)
    
    # Kontrola a případná aktualizace ročních dat pro aktuální rok (pouze v debug módu)
    if DEBUG:
        check_and_update_yearly_data()
    else:
        # V normálním módu zkontrolujeme pouze při stahování dat
        if args.year or args.start_date or args.date or args.get_rate or args.report_year or args.report_period:
            current_year = datetime.now().year
            # Pro jednoduchost v normálním módu nebudeme kontrolovat konzistenci automaticky
            pass
    
    # Zde bude logika pro zpracování argumentů
    if args.year:
        debug_print(f"Stahuji roční data pro rok {args.year}...")
        # Ujistěme se, že adresář data existuje
        os.makedirs("data", exist_ok=True)
        # Volání funkce pro stažení ročních dat
        data_fetcher.download_yearly_data(args.year, output_dir="data")
    elif args.currency and args.start_date and args.end_date and not args.report_period:
        # Měsíční stahování dat
        debug_print(f"Stahuji měsíční data pro měnu {args.currency} od {args.start_date} do {args.end_date}...")
        # Ujistěme se, že adresář data existuje
        os.makedirs("data", exist_ok=True)
        # Volání funkce pro stažení měsíčních dat
        data_fetcher.download_monthly_data(args.currency, args.start_date, args.end_date, output_dir="data")
    elif args.date:
        debug_print(f"Stahuji denní data pro datum {args.date}...")
        # Ujistěme se, že adresář data existuje
        os.makedirs("data", exist_ok=True)
        # Volání funkce pro stažení denních dat
        data_fetcher.download_daily_data(args.date, output_dir="data")
    elif args.get_rate and args.currency:
        date_str = args.get_rate
        currency_code = args.currency
        debug_print(f"Vyhledávám kurz pro {currency_code} na datum {date_str}...")
        rate = rate_finder.get_rate_for_date(date_str, currency_code)
        if rate:
            # Pro --get-rate v normálním režimu zobrazíme pouze kurz
            if not DEBUG:
                print(rate)
            else:
                print(f"Kurz {currency_code} na datum {date_str} (nebo nejbližší pracovní den): {rate}")
        else:
            # Pokud nebyl kurz nalezen a je aktivní přepínač --auto-download, zkusíme stáhnout denní data
            if args.auto_download:
                try:
                    requested_date = datetime.strptime(date_str, "%d.%m.%Y")
                    today = datetime.now()
                    
                    # Zkontrolujeme, zda je požadované datum dnešní
                    if requested_date.date() == today.date():
                        # Zkontrolujeme, zda je čas po 14:30
                        if today.time() >= datetime.strptime("14:30", "%H:%M").time():
                            debug_print("Automaticky stahuji denní data...")
                            # Ujistěme se, že adresář data existuje
                            os.makedirs("data", exist_ok=True)
                            # Stáhneme denní data pro dnešní datum
                            today_str = today.strftime("%d.%m.%Y")
                            data_fetcher.download_daily_data(today_str, output_dir="data")
                            # Zkusíme znovu vyhledat kurz
                            rate = rate_finder.get_rate_for_date(date_str, currency_code)
                            if rate:
                                if not DEBUG:
                                    print(rate)
                                else:
                                    print(f"Kurz {currency_code} na datum {date_str} (nebo nejbližší pracovní den): {rate}")
                            else:
                                if not DEBUG:
                                    print("Kurz nenalezen")
                                else:
                                    print(f"Kurz {currency_code} na datum {date_str} (ani v předchozích dnech) nebyl nalezen ani po stažení denních dat.")
                        else:
                            if not DEBUG:
                                print("Kurz nenalezen")
                            else:
                                print(f"Chyba: Automatické stahování nelze provést, protože čas ještě není po 14:30. Aktuální čas je {today.strftime('%H:%M')}.")
                    else:
                        if not DEBUG:
                            print("Kurz nenalezen")
                        else:
                            print("Automatické stahování denních dat je možné pouze pro dnešní datum.")
                except ValueError:
                    if not DEBUG:
                        print("Kurz nenalezen")
                    else:
                        print(f"Neplatný formát data: {date_str}")
            else:
                if not DEBUG:
                    print("Kurz nenalezen")
                else:
                    print(f"Kurz {currency_code} na datum {date_str} (ani v předchozích dnech) nebyl nalezen.")
    elif args.report_year and args.currency:
        if args.report_month:
            # Generování měsíčního reportu
            debug_print(f"Generuji měsíční report pro {args.currency} za {args.report_month}/{args.report_year}...")
            rate_reporter.generate_monthly_report(args.report_year, args.report_month, args.currency, output_dir="data")
        else:
            # Generování ročního reportu
            debug_print(f"Generuji roční report pro {args.currency} za rok {args.report_year}...")
            rate_reporter.generate_yearly_report(args.report_year, args.currency, output_dir="data")
    elif args.report_period and args.currency:
        # Generování reportu za období
        start_date, end_date = args.report_period
        debug_print(f"Generuji report pro {args.currency} za období {start_date} - {end_date}...")
        rate_reporter.generate_period_report(start_date, end_date, args.currency, output_dir="data")
    else:
        if DEBUG:
            parser.print_help()
        sys.exit(1)

if __name__ == "__main__":
    main()