

import pandas as pd
from pyshop import ShopSession

def build_model(shop:ShopSession) -> None:
    starttime = pd.Timestamp('2018-02-26')
    endtime = pd.Timestamp('2018-02-27 13:00:00')
    shop.set_time_resolution(starttime=starttime, endtime=endtime, timeunit='hour')

    rsv1 = shop.model.reservoir.add_object('Reservoir1')
    rsv1.max_vol.set(12)
    rsv1.lrl.set(90)
    rsv1.hrl.set(100)
    rsv1.vol_level.set(pd.Series([90, 100, 101], index=[0, 12, 14], name=0))
    rsv1.flow_descr.set(pd.Series([0, 1000], index=[100, 101], name=0))

    plant1 = shop.model.plant.add_object('Plant1')
    plant1.outlet_line.set(0)
    plant1.main_loss.set([0.0002])
    plant1.penstock_loss.set([0.0001])

    p1g1 = shop.model.generator.add_object('Plant1_G1')
    plant1.connect_to(p1g1)
    p1g1.penstock.set(1)
    p1g1.p_min.set(0)
    p1g1.p_max.set(100)
    p1g1.p_nom.set(100)
    p1g1.startcost.set(500)
    p1g1.gen_eff_curve.set(pd.Series([95, 98], index=[0, 100]))
    p1g1.turb_eff_curves.set([pd.Series([65, 75, 90, 93, 89], index=[10, 25, 70, 90, 100], name=85),
                              pd.Series([72, 81, 94, 96, 93], index=[10, 25, 70, 90, 100], name=90),
                              pd.Series([74, 85, 97, 99, 96], index=[10, 25, 70, 90, 100], name=95),
                            pd.Series([73, 83, 96, 97.5, 95], index=[10, 25, 70, 90, 100], name=100)])
    # Connect objects
    rsv1.connect_to(plant1)

    rsv1.energy_value_input.set(39.7)
    rsv1.start_level.set(100)

    #Add market
    shop.model.market.add_object('Day_ahead')
    da = shop.model.market.Day_ahead
    da.sale_price.set(49.99)
    da.buy_price.set(da.sale_price.get()+0.02)
    da.max_buy.set(9999)
    da.max_sale.set(9999)

    starttime = shop.get_time_resolution()['starttime']
    rsv1.inflow.set(pd.DataFrame([0, 0], index=[starttime, starttime + pd.Timedelta(hours=1)]))

def run_model(shop:ShopSession) -> None:
    shop.save_pq_curves(['on'], [])
    shop.start_sim([], [3])
    shop.set_code(['incremental'], [])
    shop.start_sim([], [3])