import sympy as sp
from decimal import Decimal
import math

class Berechnungen:
    def __init__(self, a, b):
        self.a_wert = a
        self.b_wert = b
        self.e_quadrat_wert = self.e_quadrat()
        self.e_strich_quadrat_wert = self.e_strich_quadrat()

    def e_quadrat(self):
        return (self.a_wert**2 - self.b_wert**2) / self.a_wert **2

    def e_strich_quadrat(self):
        return (self.a_wert**2 - self.b_wert**2) / self.b_wert **2

    def P(self, x, y):
        return sp.sqrt(x**2 + y**2)

    def hilfswinkel(self, z, x, y):
        hw = sp.atan2(z * self.a_wert, self.P(x, y) * self.b_wert)
        return hw

    def B(self, z, x, y):
        hilfswinkel = self.hilfswinkel(z, x, y)
        B = sp.atan2((z + self.e_strich_quadrat_wert * self.b_wert * sp.sin(hilfswinkel) ** 3), (self.P(x, y) - self.e_quadrat_wert * self.a_wert * sp.cos(hilfswinkel) ** 3))
        return B

    def L(self, x, y):
        return sp.atan2(y, x)

    def H(self, x, y, z):
        B = self.B(z, x, y)
        H = (self.P(x, y) / sp.cos(B)) - self.a_wert / (sp.sqrt(1 - self.e_quadrat_wert * sp.sin(B) ** 2))
        return H

    def geometrische_breite_laenge(self, dict_koordinaten):
        for punktnummer, matrix in dict_koordinaten.items():

            dict_koordinaten[punktnummer] = [matrix, self.B(matrix[2], matrix[0], matrix[1]), self.L(matrix[0], matrix[1])]
        return dict_koordinaten

class Einheitenumrechnung:
    def __init__(self):
        pass

    def mas_to_rad(mas):
        umrechnungsfaktor = 1 / 1000 * 1 / 3600 * sp.pi / 180
        grad = mas * umrechnungsfaktor
        return grad

    def mm_to_m(mm):
        m = mm / 1000
        return m

    def ppb(ppb):
        ppb *= 10 ** (-9)
        return ppb

    def gon_to_rad_Decimal(gon):
        gon = Decimal(gon)
        pi = Decimal(str(math.pi))
        rad = (gon / Decimal(200)) * pi
        return rad

    def mgon_to_rad_Decimal(gon):
        gon = Decimal(gon)
        pi = Decimal(str(math.pi))
        rad = (gon / Decimal(200000)) * pi
        return rad