# region imports

import Approximation as ddd


# endregion
# ---------------------------------------------------------------------------------------------------------------------
# region NL-functions, Note 3D: y corresponds to f(t), global variables must be x (define functions)

# region define 1. 3D NL- function and characteristics: c=Pmax(t)/Emax

def first_nl_func():
    def ddd_nl_func(x_bp, y_bp, i, j):
        return y_bp[j - 1] / x_bp[i - 1]

    bp_num_x = 5  # number of breakpoints x-axis
    bp_num_y = 5  # number of breakpoints y-axis

    x_limit_up = 1000  # reasonable upper limit x-variable
    x_limit_low = 1  # reasonable lower limit x-variable
    y_limit_up = 1000  # reasonable upper limit y-variable
    y_limit_low = 0  # reasonable lower limit y-variable

    x = ddd.ddd_lin_approx(ddd_nl_func, bp_num_x, bp_num_y, x_limit_up, y_limit_up, x_limit_low, y_limit_low)[0]
    y = ddd.ddd_lin_approx(ddd_nl_func, bp_num_x, bp_num_y, x_limit_up, y_limit_up, x_limit_low, y_limit_low)[1]
    z = ddd.ddd_lin_approx(ddd_nl_func, bp_num_x, bp_num_y, x_limit_up, y_limit_up, x_limit_low, y_limit_low)[2]
    return x, y, z, bp_num_x, bp_num_y


# endregion

# region define 2. 3D NL- function and characteristics: SOC=E(t)/Emax

def second_nl_func():
    def ddd_nl_func(x_bp, y_bp, i, j):
        return y_bp[j - 1] / x_bp[i - 1]

    bp_num_x = 5  # number of breakpoints x-axis
    bp_num_y = 5  # number of breakpoints y-axis

    x_limit_up = 1000  # reasonable upper limit x-variable
    x_limit_low = 1  # reasonable lower limit x-variable
    y_limit_up = 1000  # reasonable upper limit y-variable
    y_limit_low = 0  # reasonable lower limit y-variable

    x = ddd.ddd_lin_approx(ddd_nl_func, bp_num_x, bp_num_y, x_limit_up, y_limit_up, x_limit_low, y_limit_low)[0]
    y = ddd.ddd_lin_approx(ddd_nl_func, bp_num_x, bp_num_y, x_limit_up, y_limit_up, x_limit_low, y_limit_low)[1]
    z = ddd.ddd_lin_approx(ddd_nl_func, bp_num_x, bp_num_y, x_limit_up, y_limit_up, x_limit_low, y_limit_low)[2]
    return x, y, z, bp_num_x, bp_num_y


# endregion

# endregion
# ---------------------------------------------------------------------------------------------------------------------
# region data for pyomo (data management)

data = {

    "Instance_1": {
        'M': {None: 2000},
        'x1': first_nl_func()[0],
        'y1': first_nl_func()[1],
        'z1': first_nl_func()[2],
        'bp_num_x1': {None: first_nl_func()[3]},
        'bp_num_y1': {None: first_nl_func()[4]},
        'x2': second_nl_func()[0],
        'y2': second_nl_func()[1],
        'z2': second_nl_func()[2],
        'bp_num_x2': {None: second_nl_func()[3]},
        'bp_num_y2': {None: second_nl_func()[4]},

    }}

# endregion
# ---------------------------------------------------------------------------------------------------------------------
