import pandas as pd
from flask import request, Flask, json
from sqlalchemy import create_engine

app = Flask(__name__)

engine = create_engine("mysql+mysqldb://python:sqlalchemy@GC-SERVER1/tasks")


@app.route("/tickets", methods=["POST", "GET"])
def tickets():
    data = request.args
    if not data.get("id") is None:
        if data.get("id") == "":
            query = (
                f"INSERT INTO tickets (datum, benutzer, kunde, kontakt, beschreibung, termin, dauer, status, prioritaet, "
                f"fortschritt, kategorie, programm, kommentar) "
                f"VALUES ('{data['datum']}', '{data['benutzer']}', '{data['kunde']}', '{data['kontakt']}', '{data['beschreibung']}', "
                f"'{data['termin']}', '{data['dauer']}', "
                f"'{data['status']}', '{data['prioritaet']}', '{data['fortschritt']}', "
                f"'{data['kategorie']}', '{data['programm']}', '{data['kommentar']}')"
            )
        else:
            query = (
                f"UPDATE tickets SET datum = '{data['datum']}', benutzer = '{data['benutzer']}', kunde = '{data['kunde']}', "
                f"kontakt = '{data['kontakt']}', beschreibung = '{data['beschreibung']}', termin = '{data['termin']}', "
                f"dauer = '{data['dauer']}',	status = '{data['status']}', "
                f"prioritaet = '{data['prioritaet']}', fortschritt = '{data['fortschritt']}', "
                f"kategorie = '{data['kategorie']}', programm = '{data['programm']}', "
                f"kommentar = '{data['kommentar']}'  WHERE id = '{data['id']}' "
            )
        with engine.connect() as con:
            con.execute(query)

    df = pd.read_sql("SELECT * FROM tickets", engine)
    return df.to_json()


@app.route("/benutzer", methods=["POST", "GET"])
def benutzer():
    df = pd.read_sql("SELECT * FROM benutzer", engine)
    return df.to_json()


@app.route("/kunden", methods=["POST", "GET"])
def kunden():
    data = request.args
    kunde = request.args.items()
    if not data.get("id") is None:
        for kunde in data:
            if kunde.get("kunde") != "":
                query = (
                    f"UPDATE kunden SET system = '{kunde['system']}', start_soll = '{kunde['start_soll']}', "
                    f"ende_soll = '{kunde['ende_soll']}', "
                    f"erster_status = '{kunde['erster_status']}', aktiv = '{kunde['aktiv']}', woche = '{kunde['woche']}', "
                    f"bundesland = '{kunde['bundesland']}', plz = '{kunde['plz']}', ort = '{kunde['ort']}' "
                    f"WHERE kunde = '{kunde['kunde']}' "
                )

            with engine.connect() as con:
                con.execute(query)

    df = pd.read_sql("SELECT * FROM kunden", engine)
    return df.to_json()


@app.route("/fehlerbericht", methods=["POST", "GET"])
def fehlerbericht():
    data = request.args
    kunde = request.args.get("kunde")
    datum = request.args.get("datum")
    start = request.args.get("start")
    if data.get("id") is None:
        query = (
            f"SELECT sm.*, k.whitelist FROM status_meldung sm INNER JOIN kunden k USING (kunde) "
            f"WHERE sm.datum = '{datum}' AND sm.kunde = '{kunde}' AND sm.start = '{start}' LIMIT 1"
        )
        df = pd.read_sql(query, engine)
        df["fehlerbericht"] = df["fehlerbericht"].apply(json.loads)
        # df["whitelist"] = df["whitelist"].apply(json.loads)
        if df.get("kommentar_id") != "":
            query = f"SELECT sk.* FROM status_kommentar sk WHERE sk.id = '{df['kommentar_id']}' "
        else:
            query = (
                f"SELECT sk.* FROM status_kommentar sk "
                f"WHERE sk.datum = '{datum}' AND sk.kunde = '{kunde}' AND sk.start = '{start}' "
                "ORDER BY cdate DESC LIMIT 1"
            )
        with engine.connect() as con:
            con.execute(query)

    response = app.response_class(
        response=df.to_json(indent=2), status=200, mimetype="application/json"
    )

    return response


@app.route("/whitelist", methods=["POST", "GET"])
def whitelist():
    kunde = request.args.get("kunde")
    pd.read_sql(f"SELECT * FROM kunden WHERE kunde = '{kunde}' ", engine)


@app.route("/zeit", methods=["POST", "GET"])
def zeit():
    start_soll = request.args.get("start_soll")
    ende_soll = request.args.get("ende_soll")
    kunde = request.args.get("kunde")
    with engine.connect() as con:
        con.execute(
            f"UPDATE kunden SET start_soll = '{start_soll}', ende_soll = '{ende_soll}' WHERE kunde = '{kunde}'"
        )

    return 1


@app.route("/kommentar", methods=["POST", "GET"])
def kommentar():
    pass


@app.route("/config", methods=["POST", "GET"])
def config():
    df = pd.read_sql(
        "SELECT kunde, datum FROM kunden_config ORDER BY 1, 2 DESC", engine
    )
    return df.to_json


@app.route("/liste", methods=["POST", "GET"])
def liste():
    datum_req = request.args.get("datum")
    if not datum_req or datum_req == "":
        datum = "a.datum > date_add(now(), INTERVAL -32 DAY)"
    else:
        datum = f"a.datum >= '{datum_req}' "
    datum_bis_req = request.args.get("datum_bis")
    if not datum_bis_req or datum_bis_req == "":
        datum_bis = "a.datum > date_add(now(), INTERVAL -32 DAY)"
    else:
        datum_bis = f"a.datum >= '{datum_bis_req}' "
    kunde_req = request.args.get("kunde")
    if not kunde_req or kunde_req == "":
        kunde = "1"
    else:
        kunde = f"k.kunde LIKE '%{kunde_req}%'"

    query = (
        f"SELECT DISTINCT a.datum, k.kunde, sm.aufgabe, k.system, a.bundesland, a.feiertag, k.start_soll, k.ende_soll, "
        f"sm.start, sm.ende, sm.anzahl, if(sk2.id IS NULL, sm.bearbeitet, '1') as bearbeitet,"
        f" case"
        f" when woche = 'Mo-Fr' then mofr"
        f" when woche = 'Mo-Sa' then mosa"
        f" when woche = 'Mo-So' then moso"
        f" when woche = 'Di-So' then diso"
        f" else 1"
        f" end * if(sk.status <= 1, 0, 1) * if(sm.anzahl > 0 or (sm.anzahl is null and now() > date_add(concat(a.datum, ' ', k.ende_soll), "
        f"INTERVAL 1 HOUR)), 1, 0) as fehler,"
        f" if(sm.anzahl is null and now() > date_add(concat(a.datum, ' ', k.ende_soll), INTERVAL 1 HOUR), 1, 0) as fehlend,"
        f" ifnull(sk.benutzer, '') as benutzer"
        f" FROM arbeitstage a"
        f" INNER JOIN kunden k USING (bundesland)"
        f" LEFT JOIN status_meldung sm USING (datum, kunde)"
        f" LEFT JOIN status_kommentar sk ON sm.kommentar_id = sk.id"
        f" LEFT JOIN status_kommentar as sk2 ON a.datum = sk2.datum AND k.kunde = sk2.kunde"
        f" WHERE {datum} AND {datum_bis} AND {kunde} AND a.datum <= now() AND k.erster_status <= a.datum"
        f" AND k.aktiv = 1"
        f" ORDER BY a.datum, k.ende_soll"
    )

    df = pd.read_sql(query, engine)
    return df.to_json()


@app.route("/events", methods=["POST", "GET"])
def events():
    pass


if __name__ == "__main__":
    app()