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

# Seznam vybraných obcí
typicke_obce = {
    "Dolní Morava": "Dolní Morava",
    "Jeseník": "Jeseník",
    "Hranice": "Hranice",
    "Lutín": "Lutín",
    "Velký Týnec": "Velký Týnec",
    "Křelov-Břuchotín": "Křelov-Břuchotín"
}


# Výpočet dat
def priprav_data_pro_graf(df_leto, df_podzim, obec):
    data_leto = df_leto[df_leto["NAZEV"] == obec].iloc[0]
    data_podzim = df_podzim[df_podzim["NAZEV"] == obec].iloc[0]

    def vypocet_podil(data, interval, celkovy_pocet, kat):
        return [
            sum([data[f"{kat}_d{den}_{hod}_h"] for hod in interval]) / celkovy_pocet[den - 1] * 100 if celkovy_pocet[
                                                                                                           den - 1] > 0 else 0
            for den in range(1, 8)
        ]

    celkovy_pocet = [[
        sum([data_leto[f"CelkPocOs_d{den}_{hod}_h"] for hod in denni_interval]) for den in range(1, 8)
    ], [
        sum([data_leto[f"CelkPocOs_d{den}_{hod}_h"] for hod in nocni_interval]) for den in range(1, 8)
    ], [
        sum([data_podzim[f"CelkPocOs_d{den}_{hod}_h"] for hod in denni_interval]) for den in range(1, 8)
    ], [
        sum([data_podzim[f"CelkPocOs_d{den}_{hod}_h"] for hod in nocni_interval]) for den in range(1, 8)
    ]]

    data = {kat: [
        vypocet_podil(data_leto, denni_interval, celkovy_pocet[0], kat),
        vypocet_podil(data_leto, nocni_interval, celkovy_pocet[1], kat),
        vypocet_podil(data_podzim, denni_interval, celkovy_pocet[2], kat),
        vypocet_podil(data_podzim, nocni_interval, celkovy_pocet[3], kat)
    ] for kat in ["Rezid", "PracSkolDoj", "Navst"]}

    return celkovy_pocet, data


# Funkce pro vykreslení grafu do matice 2×2 s jedinou legendou
def vykresli_porovnani_matrice(celkovy_pocet, data, nazev):
    obdobi = ["Léto - Den", "Léto - Noc", "Podzim - Den", "Podzim - Noc"]
    barvy = {"Rezid": "#1f77b4", "PracSkolDoj": "#ff7f0e", "Navst": "#d62728"}  # Residenti, Dojíždějící, Návštěvníci
    dny_tydne = ["Po", "Út", "St", "Čt", "Pá", "So", "Ne"]

    fig, axes = plt.subplots(2, 2, figsize=(14, 12), sharex=True, sharey=True)

    handles = []  # Seznam pro legendu

    for i, (ax, period) in enumerate(zip(axes.flat, obdobi)):
        dolni_hodnoty = np.zeros(7)
        for j, (kategorie, hodnoty) in enumerate(data.items()):
            bars = ax.bar(dny_tydne, hodnoty[i], bottom=dolni_hodnoty, label=kategorie, color=barvy[kategorie])

            # Uložíme handly (pouze pro první subplot, aby se legenda opakovala jen jednou)
            if i == 0:
                handles.append(bars[0])

            # Vložení hodnot do sloupců
            for bar, hodnota in zip(bars, hodnoty[i]):
                text_y = bar.get_y() + bar.get_height() / 2 - (
                    1 if kategorie == "PracSkolDoj" else 0)  # Posun pro oranžové sloupce
                ax.text(bar.get_x() + bar.get_width() / 2, text_y, f"{hodnota:.1f}%", ha='center', va='center',
                        fontsize=9, color="black", fontweight="bold")

            dolni_hodnoty += np.array(hodnoty[i])

        # Počet osob nad sloupcem
        for idx, label in enumerate(celkovy_pocet[i]):
            ax.text(idx, max(dolni_hodnoty) + 5, str(int(label)), ha="center", va="bottom", fontsize=10,
                    fontweight="bold", color="black")

        ax.set_title(f"{nazev} - {period}", fontsize=12, fontweight="bold", pad=15)
        ax.set_ylabel("Podíl v %")
        ax.grid(axis="y", linestyle="--", alpha=0.7)

    # Přidání jediné legendy pod grafy
    fig.legend(handles, ["Residenti", "Dojíždějící", "Návštěvníci"], loc="lower center", ncol=3, fontsize=12,
               frameon=False)

    # Posunutí nadpisu
    fig.suptitle(f"Porovnání struktury osob v obci {nazev} - Matice 2×2", fontsize=16, fontweight="bold", y=1.03)
    plt.tight_layout(rect=[0, 0.05, 1, 1])  # Posunutí pro legendu

    plt.show()


# Vykreslení grafů pro všechny obce ve formátu matice 2×2
for nazev, obec in typicke_obce.items():
    celkovy_pocet, data = priprav_data_pro_graf(df_leto, df_podzim, obec)
    vykresli_porovnani_matrice(celkovy_pocet, data, nazev)


# skript byl optimalizován pomocí ChatGPT 4.0
