import random
import winkelumrechnungen as wu
from typing import List, Tuple
import numpy as np
from ellipsoide import EllipsoidTriaxial
from GHA_triaxial.gha1_ES import jacobi_konstante

ell = EllipsoidTriaxial.init_name("KarneyTest2024")

def line2example(line: str) -> List:
    """
    Line-String in Liste umwandeln
    :param line: Line-String
    :return: Liste mit Zahlenwerten
    """
    split = line.split()
    example = [float(value) for value in split[:7]]
    for i, value in enumerate(example):
        if i < 6:
            example[i] = wu.deg2rad(value)
            # example[i] = value
    return example

def get_random_examples(num: int, seed: int = None) -> List:
    """
    Rückgabe zufälliger Beispiele
    beta0, lamb0, alpha0, beta1, lamb1, alpha1, s12
    :param num: Anzahl zufälliger Beispiele
    :param seed: Random-Seed
    :return: Liste mit Beispielen
    """
    if seed is not None:
        random.seed(seed)
    with open(r"C:\Users\moell\OneDrive\Desktop\Vorlesungen\Master-Projekt\Python_Masterprojekt\GHA_triaxial\Karney_2024_Testset.txt") as datei:
        lines = datei.readlines()
    examples = []
    for i in range(num):
        example = line2example(lines[random.randint(0, len(lines) - 1)])
        examples.append(example)
    return examples

def get_examples(l_i: List) -> List:
    """
    Rückgabe ausgewählter Beispiele
    beta0, lamb0, alpha0, beta1, lamb1, alpha1, s12
    :param l_i: Liste von Indizes
    :return: Liste mit Beispielen
    """
    with open("Karney_2024_Testset.txt") as datei:
        lines = datei.readlines()
    examples = []
    for i in l_i:
        example = line2example(lines[i])
        examples.append(example)
    return examples

# beta0, lamb0, alpha0_ell, beta1, lamb1, alpha1_ell, s

def get_random_examples_simple_short(num: int, seed: int = None) -> List:
    if seed is not None:
        random.seed(seed)
    with open(r"C:\Users\moell\OneDrive\Desktop\Vorlesungen\Master-Projekt\Python_Masterprojekt\GHA_triaxial\Karney_2024_Testset.txt") as datei:
        lines = datei.readlines()
    examples = []
    while len(examples) < num:
        example = line2example(lines[random.randint(0, len(lines) - 1)])
        beta0, lamb0, alpha0_ell, beta1, lamb1, alpha1_ell, s = example
        if s < 1 and abs(abs(beta0) - np.pi/2) > 1e-5 and lamb0 != 0 and abs(abs(lamb0) - np.pi) > 1e-5:
            examples.append(example)
    return examples

def get_random_examples_umbilics_start(num: int, seed: int = None) -> List:
    if seed is not None:
        random.seed(seed)
    with open(r"C:\Users\moell\OneDrive\Desktop\Vorlesungen\Master-Projekt\Python_Masterprojekt\GHA_triaxial\Karney_2024_Testset.txt") as datei:
        lines = datei.readlines()
    examples = []
    while len(examples) < num:
        example = line2example(lines[random.randint(0, len(lines) - 1)])
        beta0, lamb0, alpha0_ell, beta1, lamb1, alpha1_ell, s = example
        if abs(abs(beta0) - np.pi/2) < 1e-5 and (lamb0 == 0 or abs(abs(lamb0) - np.pi) < 1e-5):
            examples.append(example)
    return examples

def get_random_examples_umbilics_end(num: int, seed: int = None) -> List:
    if seed is not None:
        random.seed(seed)
    with open(r"C:\Users\moell\OneDrive\Desktop\Vorlesungen\Master-Projekt\Python_Masterprojekt\GHA_triaxial\Karney_2024_Testset.txt") as datei:
        lines = datei.readlines()
    examples = []
    while len(examples) < num:
        example = line2example(lines[random.randint(0, len(lines) - 1)])
        beta0, lamb0, alpha0_ell, beta1, lamb1, alpha1_ell, s = example
        if abs(abs(beta1) - np.pi/2) < 1e-5 and (lamb1 == 0 or abs(abs(lamb1) - np.pi) < 1e-5):
            examples.append(example)
    return examples

def get_random_examples_gamma(group: str, num: int, seed: int = None, length: str = None) -> List:
    eps = 1e-20
    long_short = 2
    if seed is not None:
        random.seed(seed)
    with open(r"C:\Users\moell\OneDrive\Desktop\Vorlesungen\Master-Projekt\Python_Masterprojekt\GHA_triaxial\Karney_2024_Testset.txt") as datei:
        lines = datei.readlines()
    examples = []
    i = 0
    while len(examples) < num and i < len(lines):
        example = line2example(lines[random.randint(0, len(lines) - 1)])
        if example in examples:
            continue
        i += 1

        beta0, lamb0, alpha0_ell, beta1, lamb1, alpha1_ell, s = example
        gamma = jacobi_konstante(beta0, lamb0, alpha0_ell, ell)

        if group not in ["a", "b", "c", "d", "e"]:
            break
        elif group == "a" and not 1 >= gamma >= 0.01:
            continue
        elif group == "b" and not 0.01 > gamma > eps:
            continue
        elif group == "c" and not abs(gamma) <= eps:
            continue
        elif group == "d" and not -eps > gamma > -1e-17:
            continue
        elif group == "e" and not -1e-17 >= gamma >= -1:
            continue

        if length == "short":
            if example[6] < long_short:
                examples.append(example)
        elif length == "long":
            if example[6] >= long_short:
                examples.append(example)
        else:
            examples.append(example)

    return examples


if __name__ == "__main__":
    examples_a = get_random_examples_gamma("a", 10, 42)
    examples_b = get_random_examples_gamma("b", 10, 42)
    examples_c = get_random_examples_gamma("c", 10, 42)
    examples_d = get_random_examples_gamma("d", 10, 42)
    examples_e = get_random_examples_gamma("e", 10, 42)
    pass