import pandas as pd
from sqlalchemy import create_engine


def conn_string(dsn: dict[str, str]):
    return f"mssql+pyodbc://{dsn['user']}:{dsn['pass']}@{dsn['server']}/{dsn['database']}?driver=SQL+Server+Native+Client+11.0"


def load_data(config: dict[str, str], source: str, period: str):
    year = period[:4]
    month = period[4:6]

    select_befehl_auftraege = f"SELECT * FROM [Auftraege_NASA_gruppiert] WHERE Periode = '{period}'"
    select_befehl_mitarbeiter = f"SELECT * FROM [Mitarbeiter_NASA] WHERE Periode = '{period}'"

    source_auftraege = "data/Auftraege_NASA_gruppiert.csv"
    source_mitarbeiter = "data/Mitarbeiter_NASA.csv"

    payload = {
        "HaendlerNr": config["client_id"],
        "Filiale": config["client_id"],
        "Jahr": year,
        "Monat": month,
        "Fabrikat": "Mazda",
        "AnzahlMitarbeiter": 0,
        "AnzahlProduktiv": 0.0,
        "WerkstattDurchlaeufe": 0,
        "Token": config["credentials"]["token"],
    }

    if source == "database":
        source_db = create_engine(conn_string(config["source_dsn"]))
        df = pd.read_sql(select_befehl_auftraege, con=source_db)
        rename_from = ["AuftragsArt", "AuftragsTyp"]
        rename_to = ["AuftragsArtId_Name", "AuftragsArt"]
        df = df.rename(columns=dict(zip(rename_from, rename_to)))

    else:
        df = pd.read_csv(source_auftraege, sep=";", encoding="latin-1", decimal=",")
        df = df[df["Periode"] == period]

    # AuftragsArt = ["Inspektion", "Karosseriearbeit", "Lackierung", "Verschleißteile", "Sonstiges"]
    # AuftragsArtId = {"1": "Extern", "2": "Garantie", "3": "Intern", "4": "Theke"]

    columns = [
        "AuftragsArt",
        "AuftragsArtId",
        "TeileUmsatz",
        "LohnUmsatz",
        "SonstigeUmsatz",
        "GesamtUmsatz",
        "AnzahlAuftraege",
    ]

    df = df[columns]

    df.to_csv(
        f"{config['export_dir']}/csv/{period}_auftraege.csv",
        sep=";",
        encoding="latin-1",
        decimal=",",
        index=False,
    )

    payload["WerkstattDurchlaeufe"] = int(df["AnzahlAuftraege"].sum())
    payload["AfterSalesPositionen"] = df.to_dict("records")

    # Mitarbeiter gesamt und produktiv
    if source == "database":
        df = pd.read_sql(select_befehl_mitarbeiter, con=source_db)
    else:
        df = pd.read_csv(source_mitarbeiter, sep=";", encoding="latin-1", decimal=",")

    df.to_csv(
        f"{config['export_dir']}/csv/{period}_mitarbeiter.csv",
        sep=";",
        encoding="latin-1",
        decimal=",",
        index=False,
    )

    payload["AnzahlMitarbeiter"] = df.shape[0]
    payload["AnzahlProduktiv"] = int(df["produktiv"].sum())
    return payload
