import numpy as np
import MainNewMatrixCalculation as Mat, SVV_structural_properties as prop
from shearcentercalc import h, get_sc

z_sc, y_sc = get_sc()


class forces:
    Sy = np.zeros(41)
    Sz = np.zeros(41)
    Ta = np.zeros(41)

    def get_allvals(self):
        j = 0
        vals = np.linspace(0, Mat.la, num=41)
        for i in vals:
            self.Sy[j] = Mat.Sy(i)
            self.Sz[j] = Mat.Sz(i)
            self.Ta[j] = self.Sy[j] * (h + z_sc)
            self.Ta[j] += Mat.T(i)
            j += 1


def sintegrate(N, a, b):
    f = lambda x: np.sin(x)

    num0 = 0
    num1 = 0

    for i in range(1, N + 1):
        num0 += f(a + (i - (1 / 2)) * ((b - a) / N))
ha = data.ha  #m
d1 = data.d1  # m
d3 = data.d3  # m
P = data.P  # N
theta = data.theta  #rad
t_sk = data.t_sk  # skin thickness [m]
t_sp = data.t_sp  # spar thickness [m]
n_st = data.n_st  # number of stiffeners [-]
t_st = data.t_st  # thickness of stiffener [m]
h_st = data.h_st  # height of stiffener [m]
w_st = data.w_st  # width of stiffener [m]
t_sk = data.t_sk
E = data.E
G = data.G

z_hat = get_sc()[0]  #m
z_cent = prop.z_cent
Izz = prop.I_zz
Iyy = prop.I_yy
J = prop.J
xI = x2 - xa / 2
xII = x2 + xa / 2
################################################

start_time = time.time()

#Opening and reading the file text of the Fokker 100
file_f100 = open("aerodynamicloadf100.dat", "r")
lines = file_f100.readlines()

#Variables
def shearstress(location, Sy, Sz, T):
    z_sc, y_sc = get_sc()
    # T += Sy * z_sc
    z_c = prop.z_cent - h  #z-location from the spar
    # ------------------------------------------------------------------------------------------
    '''
        Shear Flow calculations below
        fvi fhi are vertical and horizontal  
    '''
    # ------------------------------------------------------------------------------------------
    fv1 = lambda y: prop.t_sk * h**2 * np.sin(y)
    fv2 = lambda y: prop.t_sp * y
    fv3 = lambda s: prop.t_sk * h - (prop.t_sk * h * s) / lsk
    fv4 = lambda s: prop.t_sk * -h * s / lsk
    fv5 = lambda y: prop.t_sp * y
    fv6 = lambda y: prop.t_sk * h**2 * np.sin(y)

    fh1 = lambda z: -h**2 * prop.t_sk + h**2 * prop.t_sk * np.cos(
        z) + z_c * h * prop.t_sk
    fh2 = lambda z: -h * prop.t_sp - prop.t_sp * z_c
    fh3 = lambda s: -h * prop.t_sk - z_c * prop.t_sk - (
        (prop.Ca - h) * prop.t_sk * s) / lsk
    fh4 = lambda s: -prop.Ca * prop.t_sk - z_c * prop.t_sk + (
        (prop.Ca - h) * prop.t_sk * s) / lsk
    fh5 = lambda z: -prop.t_sp * h - prop.t_sp * z_c
    fh6 = lambda z: -h**2 * prop.t_sk + h**2 * np.cos(
        z) * prop.t_sk - z_c * prop.t_sk * h

    qy1 = sf.get_qy(1, Sy, prop.I_zz, fv1, 1000, 0,
                    np.pi / 2)  #vertical shear flow for section 1
    qz1 = sf.get_qz(1, Sz, prop.I_yy, fh1, 1000, 0,
                    np.pi / 2)  #horizontal shear flow for section 1

    qy2 = sf.get_qy(2, Sy, prop.I_zz, fv2, 1000, 0,
                    h)  #vertical shear flow for section 2
    qz2 = sf.get_qz(2, Sz, prop.I_yy, fh2, 1000, 0,
                    h)  #horizontal shear flow for section 2

    qy3 = sf.get_qy(3, Sy, prop.I_zz, fv3, 1000, 0,
                    lsk)  #vertical shear flow for section 3
    qz3 = sf.get_qz(
        3, Sz, prop.I_yy, fh3, 1000, 0, lsk,
        (qy1 + qz1 + qy2 + qz2))  #horizontal shear flow for section 3

    qy4 = sf.get_qy(4, Sy, prop.I_zz, fv4, 1000, 0,
                    lsk)  #vertical shear flow for section 4
    qz4 = sf.get_qz(4, Sz, prop.I_yy, fh4, 1000, 0, lsk,
                    (qy3 + qz3))  #horizontal shear flow for section 4

    qy5 = sf.get_qy(5, Sy, prop.I_zz, fv5, 1000, 0,
                    -h)  #vertical shear flow for section 5
    qz5 = sf.get_qz(5, Sz, prop.I_yy, fh5, 1000, 0,
                    -h)  #horizontal shear flow for section 5

    qy6 = sf.get_qy(6, Sy, prop.I_zz, fv6, 1000, np.pi / -2,
                    0)  #vertical shear flow for section 6
    qz6 = sf.get_qz(
        6, Sz, prop.I_yy, fh6, 1000, np.pi / -2, 0,
        (qy4 + qz4 + qz5 + qy5))  #horizontal shear flow for section 6

    theta = np.linspace(0, np.pi / 2, num=1000)
    y_points = np.linspace(0, prop.ha / 2, num=1000)  #y-points for section 2
    s_points = np.linspace(0, lsk, num=1000)  #s points for section 3 and 4
    y_points2 = np.linspace(0, prop.ha / -2, num=1000)  #y-points for section 5
    theta2 = np.linspace(np.pi / -2, 0, num=1000)  # theta for section 6

    q1_ar = []  #total shear, horizontal + vertical for section 1
    q2_ar = []  #total shear, horizontal + vertical for section 2
    q3_ar = []  #total shear, horizontal + vertical for section 3
    q4_ar = []  #total shear, horizontal + vertical for section 4
    q5_ar = []  #total shear, horizontal + vertical for section 5
    q6_ar = []  #total shear, horizontal + vertical for section 6

    for i in range(1000):
        q1_ar.append(
            sf.get_qy(1, Sy, prop.I_zz, fv1, 100, 0, theta[i]) +
            sf.get_qz(1, Sz, prop.I_yy, fh1, 100, 0, theta[i]))
        q2_ar.append(
            sf.get_qy(2, Sy, prop.I_zz, fv2, 100, 0, y_points[i]) +
            sf.get_qz(2, Sz, prop.I_yy, fh2, 100, 0, y_points[i]))
        q3_ar.append(
            sf.get_qy(3, Sy, prop.I_zz, fv3, 100, 0, s_points[i]) +
            sf.get_qz(3, Sz, prop.I_yy, fh3, 100, 0, s_points[i], (qy1 + qz1 +
                                                                   qy2 + qz2)))
        q4_ar.append(
            sf.get_qy(4, Sy, prop.I_zz, fv4, 100, 0, s_points[i]) +
            sf.get_qz(4, Sz, prop.I_yy, fh4, 100, 0, s_points[i], (qy3 + qz3)))
        q5_ar.append(
            sf.get_qy(5, Sy, prop.I_zz, fv5, 100, 0, y_points2[i]) +
            sf.get_qz(5, Sz, prop.I_yy, fh5, 100, 0, y_points2[i]))
        q6_ar.append((sf.get_qy(6, Sy, prop.I_zz, fv6, 100, np.pi /
                                -2, theta2[i])) +
                     sf.get_qz(6, Sz, prop.I_yy, fh6, 100, np.pi /
                               -2, theta2[i], (qy4 + qz4 + qz5 + qy5)))

    qt1, qt2 = sf.get_q0(T)

    q1_ar = np.array(q1_ar)
    q2_ar = np.array(q2_ar)
    q3_ar = np.array(q3_ar)
    q4_ar = np.array(q4_ar)
    q5_ar = np.array(q5_ar)
    q6_ar = np.array(q6_ar)

    #Adding redundant flow
    q1_ar = q1_ar + qt1
    q6_ar = q6_ar + qt1
    q2_ar = q2_ar + (qt2 - qt1)
    q5_ar = q5_ar + (qt1 - qt2)
    q3_ar = q3_ar + qt2
    q4_ar = q4_ar + qt2
    return q1_ar, q2_ar, q3_ar, q4_ar, q5_ar, q6_ar