import sys
import os
import csv
from datetime import datetime, timedelta

# 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__), '..', 'src'))

import data_fetcher
import holidays

def create_test_csv(filename, dates):
    """
    Vytvoří testovací CSV soubor s danými daty.
    
    :param filename: Jméno souboru.
    :param dates: Seznam dat ve formátu DD.MM.YYYY.
    """
    with open(filename, 'w', newline='', encoding='utf-8') as csvfile:
        writer = csv.writer(csvfile)
        # Hlavička
        writer.writerow(["Datum", "1_USD", "1_EUR"])
        # Data
        for date in dates:
            writer.writerow([date, "25.0", "28.0"])

def test_consistency_with_all_required_dates():
    """Test: Všechny požadované pracovní dny jsou v souboru."""
    print("Test: Všechny požadované pracovní dny jsou v souboru...")
    
    # Vytvoříme testovací soubor
    test_file = "data/test_2025_consistent.csv"
    os.makedirs("data", exist_ok=True)
    
    # Definujeme testovací data - poslední 3 pracovní dny v srpnu 2025
    # Předpokládáme, že 19.8.2025 je úterý
    test_dates = [
        "18.08.2025",  # Pondělí
        "15.08.2025",  # Pátek
        "14.08.2025"   # Čtvrtek
    ]
    
    create_test_csv(test_file, test_dates)
    
    # Upravíme funkci check_yearly_data_consistency pro testování s jiným souborem
    # Pro jednoduchost testu zkopírujeme logiku a upravíme ji
    try:
        with open(test_file, 'r', encoding='utf-8') as csvfile:
            reader = csv.reader(csvfile)
            lines = list(reader)
    except IOError as e:
        print(f"Chyba při čtení souboru {test_file}: {e}")
        return False
    
    if len(lines) < 2:
        print(f"Soubor {test_file} je prázdný nebo obsahuje pouze hlavičku.")
        return False
    
    # Získáme seznam dat z CSV (první sloupec)
    dates_in_file = []
    for line in lines[1:]:  # Přeskočíme hlavičku
        if line and line[0]:  # Zkontrolujeme, že řádek a první sloupec nejsou prázdné
            dates_in_file.append(line[0])
    
    # Pro test předpokládáme, že kontrolujeme rok 2025
    year = 2025
    
    # Zkontrolujeme poslední 3 pracovní dny
    today = datetime(2025, 8, 19)  # Simulujeme datum 19.8.2025
    checked_dates = []
    
    # Projdeme posledních 7 dní (pro jistotu) a vybereme 3 pracovní dny
    current_date = today - timedelta(days=1)  # Začneme včerejškem
    days_checked = 0
    
    while len(checked_dates) < 3 and days_checked < 7:
        date_str = current_date.strftime("%d.%m.%Y")
        
        # Zkontrolujeme, zda je to pracovní den (není víkend ani svátek)
        if not holidays.is_weekend(date_str) and not holidays.is_holiday(date_str):
            # Zkontrolujeme, zda je rok správný
            try:
                date_obj = datetime.strptime(date_str, "%d.%m.%Y")
                if date_obj.year == year:
                    checked_dates.append(date_str)
            except ValueError:
                pass
        
        current_date -= timedelta(days=1)
        days_checked += 1
    
    # Zkontrolujeme, zda všechny pracovní dny jsou v souboru
    missing_dates = []
    for date_str in checked_dates:
        if date_str not in dates_in_file:
            missing_dates.append(date_str)
    
    # Vyčistíme testovací soubor
    if os.path.exists(test_file):
        os.remove(test_file)
    
    if missing_dates:
        print(f"Test selhal: Chybí záznamy pro následující pracovní dny: {', '.join(missing_dates)}")
        return False
    else:
        print("Test: Všechny požadované pracovní dny jsou v souboru - OK")
        return True

def test_consistency_with_missing_dates():
    """Test: Některé požadované pracovní dny chybí v souboru."""
    print("Test: Některé požadované pracovní dny chybí v souboru...")
    
    # Vytvoříme testovací soubor
    test_file = "data/test_2025_inconsistent.csv"
    os.makedirs("data", exist_ok=True)
    
    # Definujeme testovací data - chybí 18.08.2025
    test_dates = [
        "15.08.2025",  # Pátek
        "14.08.2025"   # Čtvrtek
    ]
    
    create_test_csv(test_file, test_dates)
    
    # Upravíme funkci check_yearly_data_consistency pro testování s jiným souborem
    # Pro jednoduchost testu zkopírujeme logiku a upravíme ji
    try:
        with open(test_file, 'r', encoding='utf-8') as csvfile:
            reader = csv.reader(csvfile)
            lines = list(reader)
    except IOError as e:
        print(f"Chyba při čtení souboru {test_file}: {e}")
        return False
    
    if len(lines) < 2:
        print(f"Soubor {test_file} je prázdný nebo obsahuje pouze hlavičku.")
        return False
    
    # Získáme seznam dat z CSV (první sloupec)
    dates_in_file = []
    for line in lines[1:]:  # Přeskočíme hlavičku
        if line and line[0]:  # Zkontrolujeme, že řádek a první sloupec nejsou prázdné
            dates_in_file.append(line[0])
    
    # Pro test předpokládáme, že kontrolujeme rok 2025
    year = 2025
    
    # Zkontrolujeme poslední 3 pracovní dny
    today = datetime(2025, 8, 19)  # Simulujeme datum 19.8.2025
    checked_dates = []
    
    # Projdeme posledních 7 dní (pro jistotu) a vybereme 3 pracovní dny
    current_date = today - timedelta(days=1)  # Začneme včerejškem
    days_checked = 0
    
    while len(checked_dates) < 3 and days_checked < 7:
        date_str = current_date.strftime("%d.%m.%Y")
        
        # Zkontrolujeme, zda je to pracovní den (není víkend ani svátek)
        if not holidays.is_weekend(date_str) and not holidays.is_holiday(date_str):
            # Zkontrolujeme, zda je rok správný
            try:
                date_obj = datetime.strptime(date_str, "%d.%m.%Y")
                if date_obj.year == year:
                    checked_dates.append(date_str)
            except ValueError:
                pass
        
        current_date -= timedelta(days=1)
        days_checked += 1
    
    # Zkontrolujeme, zda všechny pracovní dny jsou v souboru
    missing_dates = []
    for date_str in checked_dates:
        if date_str not in dates_in_file:
            missing_dates.append(date_str)
    
    # Vyčistíme testovací soubor
    if os.path.exists(test_file):
        os.remove(test_file)
    
    if missing_dates:
        print(f"Test: Některé požadované pracovní dny chybí v souboru - OK (chybí: {', '.join(missing_dates)})")
        return True
    else:
        print("Test selhal: Všechny pracovní dny jsou v souboru, ale očekávali jsme chybějící")
        return False

def run_all_tests():
    """Spustí všechny testy."""
    print("Spouštím testy kontroly konzistence ročních dat...")
    test1_result = test_consistency_with_all_required_dates()
    test2_result = test_consistency_with_missing_dates()
    
    if test1_result and test2_result:
        print("\nVšechny testy kontroly konzistence ročních dat byly úspěšné!")
    else:
        print("\nNěkteré testy kontroly konzistence ročních dat selhaly!")

if __name__ == "__main__":
    run_all_tests()