# nbi:hide_in
# General Purpose
import numpy as np
from matplotlib import pyplot as plt
from scipy.integrate import odeint

# Jupyter Specifics
from ipywidgets.widgets import interact, IntSlider, FloatSlider, Layout

%matplotlib inline

def main(sueldo_inicial, tasa_ahorro, tasa_gasto_extra, gasto_fijo_diario, days):
    ca = tasa_ahorro * sueldo_inicial
    
    def function(c, t):
        if c <= ca:
            tasa_salida = 0
        else:
            tasa_salida = tasa_gasto_extra * (c - ca)
        return -gasto_fijo_diario - tasa_salida
    
    t = np.linspace(0, days, days*10)
    
    y = odeint(function, sueldo_inicial, t)
    
    #Graphic details
    fig, ax = plt.subplots(figsize=(15, 10))    
    
    ax.plot((0, days), (ca, ca), label='Colchon de ahorro')
    ax.plot(t, y, label='Capital(t)')
    
    if days <= 60:
        step = 1
        rotation = "horizontal"
    elif days <= 300:
        step = 5
        rotation = "vertical"
    else:
        step = 10
        rotation = "vertical"
    
    ax.set_xticklabels(np.arange(0, days + 1, step, dtype=int), rotation=rotation)
    ax.set_xticks(np.arange(0, days + 1, step))
    
    ax.set_yticks(np.arange(0, sueldo_inicial * 1.1, sueldo_inicial / 20))
    
    ax.set_xlim([0, days])
    ax.set_ylim([0, sueldo_inicial * 1.1])
    ax.set_xlabel('Días')
    ax.set_ylabel('Capital $')
    ax.legend(loc='best')
    ax.grid()
    
    plt.show()

interact(main, sueldo_inicial=IntSlider(min=0, max=25000, step=500, value=15000, layout=Layout(width='99%')),
               tasa_ahorro=FloatSlider(min=0, max=1, step=0.01, value=0.2, layout=Layout(width='99%')),
               tasa_gasto_extra=FloatSlider(min=0, max=1, step=0.005, value=0.3, layout=Layout(width='99%')),
               gasto_fijo_diario=IntSlider(min=1, max=1000, step=1, value=100, layout=Layout(width='99%')),
               days=IntSlider(min=1, max=600, step=5, value=30, layout=Layout(width='99%'))
        );