import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# Cesta k souboru
file_obce = r"C:\Škola\BAK\DATA\PROCESSED\CR_Obce_VSECHNY_OBDOBI.xlsx"

# Správné názvy listů v Excelu
list_leto = "CR_obce_20220723_20220819_Merge"
list_podzim = "CR_obce_20221010_20221106_Merge"

# Načtení dat
xls = pd.ExcelFile(file_obce)
df_leto = pd.read_excel(xls, sheet_name=list_leto)
df_podzim = pd.read_excel(xls, sheet_name=list_podzim)

# Definování časových intervalů
nocni_interval = list(range(22, 24)) + list(range(0, 6))  # 22:00–05:00
denni_interval = list(range(6, 22))  # 06:00–21:00
celodenni_interval = list(range(0, 24))  # 00:00–23:00

# Dny v týdnu
dny_tydne = ["Po", "Út", "St", "Čt", "Pá", "So", "Ne"]

# Definice barev pro jednotlivé kategorie osob
barvy = {
    "Rezidenti": "#1f77b4",
    "Dojíždějící": "#ff7f0e",
    "Návštěvníci": "#d62728"
}


# Funkce pro výpočet rozdílu mezi celodenním podílem a podílem v aktivní části dne
def priprav_rozdil_podilu(df, obec):
    """
    Vypočítá rozdíly v podílech jednotlivých kategorií osob pro danou obec
    mezi celodenním průměrem a aktivní částí dne (06:00–21:00).
    """
    data = df[df["NAZEV"] == obec].iloc[0]

    def vypocet_rozdilu(kategorie):
        celodenni = [
            sum([data[f"{kategorie}_d{den}_{hod}_h"] for hod in celodenni_interval]) / max(
                sum([data[f"CelkPocOs_d{den}_{hod}_h"] for hod in celodenni_interval]), 1) * 100
            for den in range(1, 8)
        ]
        denni = [
            sum([data[f"{kategorie}_d{den}_{hod}_h"] for hod in denni_interval]) / max(
                sum([data[f"CelkPocOs_d{den}_{hod}_h"] for hod in denni_interval]), 1) * 100
            for den in range(1, 8)
        ]
        return [denni_hodnota - celodenni_hodnota for celodenni_hodnota, denni_hodnota in zip(celodenni, denni)]

    return {
        "Rezidenti": vypocet_rozdilu("Rezid"),
        "Dojíždějící": vypocet_rozdilu("PracSkolDoj"),
        "Návštěvníci": vypocet_rozdilu("Navst")
    }


# Funkce pro vykreslení rozdílového grafu
def vykresli_rozdilovy_graf(data, obec, period_label):
    """
    Vykreslí rozdílový sloupcový graf pro rezidenty, dojíždějící a návštěvníky
    s porovnáním aktivní části dne a celodenního průměru.
    """
    kategorie = list(data.keys())
    x = np.arange(len(dny_tydne))
    bar_width = 0.3

    fig, ax = plt.subplots(figsize=(12, 7))

    for i, kat in enumerate(kategorie):
        bars = ax.bar(x + (i - 1) * bar_width, data[kat], width=bar_width, label=kat, color=barvy[kat])
        for bar, hodnota in zip(bars, data[kat]):
            if hodnota >= 0:
                ax.text(bar.get_x() + bar.get_width() / 2, bar.get_y() + bar.get_height(),
                        f"+{hodnota:.1f}%", ha='center', va='bottom', fontsize=10, fontweight="bold")
            else:
                ax.text(bar.get_x() + bar.get_width() / 2, bar.get_y(),
                        f"{hodnota:.1f}%", ha='center', va='top', fontsize=10, fontweight="bold")

    # Nastavení os a popisů
    ax.set_xticks(x)
    ax.set_xticklabels(dny_tydne, fontsize=12)
    ax.set_ylabel("Rozdíl v podílu (%)", fontsize=14)
    ax.set_xlabel("Den v týdnu", fontsize=14)

    # Hlavní nadpis grafu
    ax.set_title(
        f"PROCENTUÁLNÍ ROZDÍL V KATEGORIÍCH OSOB - {obec.upper()} ({period_label})",
        fontsize=16,
        fontweight="bold",
        pad=60
    )

    # Podnadpis
    fig.text(0.5, 0.85,
             "Porovnání mezi celodenním průměrem (00:00–23:59) a aktivní částí dne (06:00–21:00)",
             ha="center", fontsize=13)
    # Popis dole
    fig.text(0.5, 0.025,
             "Pozitivní hodnota znamená vyšší podíl v aktivní části dne, negativní hodnota vyšší podíl v celodenním průměru.",
             ha="center", fontsize=11)

    # Legenda a mřížka
    ax.legend(title="Kategorie", fontsize=11)
    ax.grid(axis="y", linestyle="--", alpha=0.7)

    plt.tight_layout()
    plt.show()


# Generování rozdílových grafů pro Dolní Moravu
data_leto = priprav_rozdil_podilu(df_leto, "Dolní Morava")
data_podzim = priprav_rozdil_podilu(df_podzim, "Dolní Morava")

vykresli_rozdilovy_graf(data_leto, "Dolní Morava", "Léto 2022")
vykresli_rozdilovy_graf(data_podzim, "Dolní Morava", "Podzim 2022")

# Skript byl optimalizován pomocí nástroje ChatGPT 4.0
