import sys
import os
import sqlite3
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__), '..', 'src'))

import rate_reporter
import database
import holidays

def test_rate_calculation():
    """Test: Správné dopočítání kurzů pro víkendy a svátky."""
    print("Test: Správné dopočítání kurzů pro víkendy a svátky...")
    
    # Inicializujeme databázi
    database.init_db()
    
    # Vložíme testovací data
    # Pátek 1.1.2021 - svátek, kurz 21.387
    database.insert_rate("01.01.2021", "TEST", 1, 21.387)
    # Čtvrtek 31.12.2020 - pracovní den, kurz 21.380
    database.insert_rate("31.12.2020", "TEST", 1, 21.380)
    # Pondělí 4.1.2021 - pracovní den, kurz 21.259
    database.insert_rate("04.01.2021", "TEST", 1, 21.259)
    
    # Zkontrolujeme, co je ve skutečnosti v databázi
    print("\nObsah databáze pro měnu TEST:")
    conn = sqlite3.connect(database.DB_PATH)
    cursor = conn.cursor()
    cursor.execute("SELECT * FROM exchange_rates WHERE currency_code = 'TEST'")
    rows = cursor.fetchall()
    for row in rows:
        print(f"  {row}")
    conn.close()
    
    # Test 1: Sobota 2.1.2021 (víkend po svátku)
    # Měla by být použita hodnota z pátku 1.1.2021 (poslední den s kurzem před víkendem/svátkem)
    print("\nTest 1: Sobota 2.1.2021 (víkend po svátku)")
    # Zkontrolujeme, zda je 2.1.2021 víkend
    is_weekend = holidays.is_weekend("02.01.2021")
    print(f"  Je 02.01.2021 víkend? {is_weekend}")
    # Zkontrolujeme, zda je 1.1.2021 svátek
    is_holiday = holidays.is_holiday("01.01.2021")
    print(f"  Je 01.01.2021 svátek? {is_holiday}")
    # Zkontrolujeme, jaký předchozí pracovní den vrátí funkce
    prev_workday = holidays.get_previous_working_day("02.01.2021")
    print(f"  Předchozí pracovní den před 02.01.2021: {prev_workday}")
    # Zkontrolujeme kurz pro 1.1.2021
    rate_01_01 = database.get_rate("01.01.2021", "TEST")
    print(f"  Kurz pro 01.01.2021: {rate_01_01}")
    # Zkontrolujeme kurz pro 31.12.2020
    rate_31_12 = database.get_rate("31.12.2020", "TEST")
    print(f"  Kurz pro 31.12.2020: {rate_31_12}")
    
    rate = rate_reporter.get_rate_for_date_with_fallback("02.01.2021", "TEST")
    expected_rate = 21.387
    if rate == expected_rate:
        print(f"  OK: Kurz pro 02.01.2021 je {rate} (očekáváno {expected_rate})")
    else:
        print(f"  CHYBA: Kurz pro 02.01.2021 je {rate}, očekáváno {expected_rate}")
    
    # Test 2: Neděle 3.1.2021 (víkend po svátku)
    # Měla by být použita hodnota z pátku 1.1.2021
    print("\nTest 2: Neděle 3.1.2021 (víkend po svátku)")
    rate = rate_reporter.get_rate_for_date_with_fallback("03.01.2021", "TEST")
    expected_rate = 21.387
    if rate == expected_rate:
        print(f"  OK: Kurz pro 03.01.2021 je {rate} (očekáváno {expected_rate})")
    else:
        print(f"  CHYBA: Kurz pro 03.01.2021 je {rate}, očekáváno {expected_rate}")
    
    # Test 3: Běžný den bez kurzu (např. 5.1.2021 - středa bez kurzu)
    # Podle pravidel ČNB by měla být použita hodnota z posledního pracovního dne s kurzem před ním (04.01.2021)
    print("\nTest 3: Běžný den bez kurzu (05.01.2021)")
    # Zkontrolujeme kurz pro 04.01.2021
    rate_04_01 = database.get_rate("04.01.2021", "TEST")
    print(f"  Kurz pro 04.01.2021: {rate_04_01}")
    rate = rate_reporter.get_rate_for_date_with_fallback("05.01.2021", "TEST")
    expected_rate = 21.259  # Kurz z 04.01.2021 (poslední pracovní den s kurzem před 05.01.2021)
    if rate == expected_rate:
        print(f"  OK: Kurz pro 05.01.2021 je {rate} (očekáváno {expected_rate})")
    else:
        print(f"  CHYBA: Kurz pro 05.01.2021 je {rate}, očekáváno {expected_rate}")
    
    # Test 4: Pracovní den s kurzem (04.01.2021)
    # Měl by být použit jeho vlastní kurz
    print("\nTest 4: Pracovní den s kurzem (04.01.2021)")
    rate = rate_reporter.get_rate_for_date_with_fallback("04.01.2021", "TEST")
    expected_rate = 21.259
    if rate == expected_rate:
        print(f"  OK: Kurz pro 04.01.2021 je {rate} (očekáváno {expected_rate})")
    else:
        print(f"  CHYBA: Kurz pro 04.01.2021 je {rate}, očekáváno {expected_rate}")

def run_all_tests():
    """Spustí všechny testy."""
    print("Spouštím testy dopočítávání kurzů...")
    test_rate_calculation()
    print("\nTesty dopočítávání kurzů dokončeny!")

if __name__ == "__main__":
    run_all_tests()