# content of example.py
from pulp import LpProblem, LpVariable, LpMinimize, LpStatus, lpSum


def func(x):
    return x + 1


def test_pass():
    assert func(4) == 5


def test_failure():
    assert func(3) == 5


def yosh_loop():
    Items = [1, 2, 3, 4, 5]
    tif = {1: 0.2, 2: 0.5, 3: 0.3, 4: 0.8, 5: 0.1}
    iif = {1: 0.09, 2: 0.2, 3: 0.113, 4: 0.3, 5: 0.1}
    drift = 0.0
    drift_limit = 0.2
    iif_target = 0.5
    tif_target = 0.9
    item_vars = LpVariable.dicts("Item", Items, cat="Binary")
    result = 'Infeasible'

    while drift <= drift_limit:
        prob = LpProblem("tif_tcc_test", LpMinimize)
        prob += lpSum([(tif[i] + iif[i]) * item_vars[i]
                       for i in Items]), "TifTccSum"
        prob += lpSum([item_vars[i] for i in Items]) == 3, "TotalItems"
        prob += lpSum([tif[i] * item_vars[i] for i in Items
                       ]) >= tif_target - (tif_target * drift), 'TifMin'
        prob += lpSum([tif[i] * item_vars[i] for i in Items
                       ]) <= tif_target + (tif_target * drift), 'TifMax'
        prob += lpSum([iif[i] * item_vars[i] for i in Items
                       ]) >= iif_target - (iif_target * drift), 'TccMin'
        prob += lpSum([iif[i] * item_vars[i] for i in Items
                       ]) <= iif_target + (iif_target * drift), 'TccMax'

        prob.solve()

        if LpStatus[prob.status] == "Infeasible":
            for v in prob.variables():
                print(v.name, "=", v.varValue)

            drift += 0.02
        else:
            for v in prob.variables():
                print(v.name, "=", v.varValue)

            result = LpStatus[prob.status]
            break

    return result


def test_solver():
    assert yosh_loop() == 'Optimal'