import os
import sqlite3
import sympy as sp


class Datenbank_anlegen:
    def __init__(self, pfad_datenbank):
        self.pfad_datenbank = pfad_datenbank
        self.db_anlegen()

    def db_anlegen(self):
        # pfad = r"C:\Users\fabia\OneDrive\Jade HS\Master\MGW2\Masterprojekt_allgemein\Masterprojekt\Programmierung\Campusnetz\Campusnetz.db"
        if not os.path.exists(self.pfad_datenbank):
            con = sqlite3.connect(self.pfad_datenbank)
            cursor = con.cursor()
            cursor.executescript("""CREATE TABLE Netzpunkte (
                           punktnummer TEXT(10),
                           naeherungx_lh NUMERIC(9,3),
                            naeherungy_lh NUMERIC(7,3),
                            naeherungz_lh NUMERIC(8,3),
                            naeherungx_us NUMERIC(9,3),
                            naeherungy_us NUMERIC(7,3),
                            naeherungz_us NUMERIC(8,3),
                            CONSTRAINT pk_Netzpunkte PRIMARY KEY (punktnummer)
                            );
                           """);
            cursor.executescript("""CREATE TABLE Beobachtungen(
                                    beobachtungenID INTEGER,
                                    beobachtungsgruppeID INTEGER,
                                    punktnummer_sp TEXT(10),
                                    punktnummer_zp TEXT(10),
                                    instrumenteID INTEGER,
                                    tachymeter_richtung NUMERIC(8, 6),
                                    tachymeter_zenitwinkel NUMERIC(8, 6),
                                    tachymeter_distanz NUMERIC(8, 4),
                                    dateiname TEXT(200),
                                    CONSTRAINT pk_Beobachtunen PRIMARY KEY (beobachtungenID)
                                    );
                                 """);
            cursor.executescript("""CREATE TABLE Instrumente(
                                    instrumenteID INTEGER,
                                    typ TEXT(200),
                                    name TEXT(200),
                                    CONSTRAINT pk_Instrumente PRIMARY KEY (instrumenteID)
                                    );
                                    """)
            con.commit()
            cursor.close()
            con.close()

class Datenbankzugriff:
    def __init__(self, pfad_datenbank):
        self.pfad_datenbank = pfad_datenbank

    def get_koordinaten(self, koordinatenart, ausgabeart = "Dict"):
        con = sqlite3.connect(self.pfad_datenbank)
        cursor = con.cursor()
        if koordinatenart == "naeherung_lh":
            values = "punktnummer, naeherungx_lh, naeherungy_lh, naeherungz_lh"
        elif koordinatenart == "naeherung_us":
            values = "punktnummer, naeherungx_us, naeherungy_us, naeherungz_us"

        liste_koordinaten = cursor.execute(f"""
        SELECT {values} FROM Netzpunkte;
        """).fetchall()
        cursor.close()
        con.close()

        liste_koordinaten = [
            koordinate for koordinate in liste_koordinaten
            if koordinate[1] is not None and koordinate[2] is not None and koordinate[3] is not None
        ]
        if ausgabeart == "Dict":
            return {koordinate[0]: sp.Matrix([float(koordinate[1]), float(koordinate[2]), float(koordinate[3])]) for koordinate in liste_koordinaten}

    def set_koordinaten(self, dict_koordinaten, koordinatenart):
        con = sqlite3.connect(self.pfad_datenbank)
        cursor = con.cursor()

        daten = []

        for punktnummer, wert in dict_koordinaten.items():
            daten.append((
                float(wert[0]),
                float(wert[1]),
                float(wert[2]),
                str(punktnummer)
            ))

        if koordinatenart == "naeherung_lh":
            pass
        elif koordinatenart == "naeherung_us":
            cursor.executemany(f"""UPDATE Netzpunkte SET naeherungx_us = ?, naeherungy_us = ?, naeherungz_us = ? WHERE punktnummer = ? AND naeherungx_us IS NULL AND naeherungy_us IS NULL AND naeherungz_us IS NULL""", daten)


        con.commit()
        cursor.close()
        con.close()

    def set_instrument(self, typ, name):
        con = sqlite3.connect(self.pfad_datenbank)
        cursor = con.cursor()
        liste_instrumente = cursor.execute("SELECT * FROM Instrumente WHERE typ = ? AND name =?", (typ, name)).fetchall()
        if liste_instrumente == []:
            cursor.execute(
                "INSERT INTO Instrumente (typ, name) VALUES (?, ?)", (typ, name)
            )
            print(f"Das Instrument {name} wurde erfolgreich hinzugefügt.")
        else:
            id_instrument = cursor.execute(
                "SELECT instrumenteID FROM Instrumente WHERE typ = ? AND name =?", (typ, name))
            print(f"Das Instrument {name} ist bereits in der Datenbank vorhanden.\nEs hat die ID {id_instrument.fetchone()[0]}")
        con.commit()
        cursor.close()
        con.close()

    def get_instrument(self, typ):
        con = sqlite3.connect(self.pfad_datenbank)
        cursor = con.cursor()
        liste_instrumente = cursor.execute("SELECT * FROM Instrumente WHERE typ = ?", (typ,)).fetchall()
        liste_typen = cursor.execute("SELECT DISTINCT typ FROM Instrumente").fetchall()
        cursor.close()
        con.close()
        if liste_instrumente == []:
            liste_instrumente = f"Kein Instrument vom Typ {typ} gefunden. Folgende Typen stehen aktuell zur Auswahl: {liste_typen}"
        return liste_instrumente

    def get_beobachtungen_id_beobachtungsgruppe_standpunkt_zielpunkt(self, beobachtungsart):
        con = sqlite3.connect(self.pfad_datenbank)
        cursor = con.cursor()
        liste_beobachtungen = cursor.execute(f"SELECT beobachtungenID, beobachtungsgruppeID, punktnummer_sp, punktnummer_zp FROM Beobachtungen WHERE {beobachtungsart} IS NOT NULL").fetchall()
        cursor.close()
        con.close()
        return liste_beobachtungen

    def get_beobachtungen_from_beobachtungenid(self):
        con = sqlite3.connect(self.pfad_datenbank)
        cursor = con.cursor()
        liste_beobachtungen = cursor.execute(f"SELECT punktnummer_sp, punktnummer_zp, beobachtungenID, beobachtungsgruppeID, tachymeter_richtung, tachymeter_zenitwinkel, tachymeter_distanz FROM Beobachtungen").fetchall()
        cursor.close()
        con.close()
        return liste_beobachtungen