from bottle import TEMPLATE_PATH, route, run, template, redirect, get, post, request, response, auth_basic, Bottle, abort, error, static_file
import bottle
import controller
from controller import dobi_parcele_za_prikaz, dobi_info_parcele, dodaj_gosta_na_rezervacijo, naredi_rezervacijo, dobi_rezervacijo_po_id, zakljuci_na_datum_in_placaj, dobi_postavke_racuna
import datetime as dt

@bottle.get('/')
def root():
    redirect('/domov')

@bottle.get('/domov')
def index():
    parcele = dobi_parcele_za_prikaz(dt.date.today())
    return template("domov", parcele=parcele, hide_header_back=True)

@bottle.get("/parcela/<id_parcele>")
def parcela(id_parcele):
    'Preverimo stanje parcele'
    rez, gostje = dobi_info_parcele(id_parcele, dt.date.today())
    if rez is not None:
        stanje = "Parcela je trenutno zasedena"
    else:
        stanje = "Parcela je trenutno na voljo"
    return template('parcela', id_parcela=id_parcele, rezervacija=rez, stanje=stanje, gostje=gostje)


@bottle.get("/naredi-rezervacijo/<id_parcele>")
def nova_rezervacija(id_parcele=None):
    print(id_parcele)
    today = dt.date.today()
    tomorrow = today + dt.timedelta(days=1)
    return template('nova_rezervacija', id_parcele=id_parcele, today=today, tomorrow=tomorrow)

@bottle.post("/naredi-rezervacijo")
def naredi_novo_rezervacijo():
    " V modelu naredi novo rezervacijo in ji doda prvega gosta"

    # Preberemo lastnosti iz forme
    ime = request.forms.ime#get("")
    priimek = request.forms.priimek#get("")
    emso = request.forms.emso#get("")
    drzava = request.forms.drzava#get("")
    id_parcele = request.forms.id_parcele#get("")
    od = request.forms.zacetek#get("")
    do = request.forms.konec#get("")

    print(ime, priimek)

    try:
        datum_od = dt.datetime.fromisoformat(od).date()
        datum_do = dt.datetime.fromisoformat(do).date()
    except Exception as e:
        print(e)
        print("Napaka pri pretvorbi datumov")
        return redirect("/naredi-rezervacijo")
    
    rezervacija = naredi_rezervacijo(id_parcele)
    dodaj_gosta_na_rezervacijo(rezervacija.id_rezervacije, {
        "EMSO":emso,
        "ime":ime,
        "priimek":priimek,
        "drzava":drzava,
    }, datum_od, datum_do)
    return redirect(f"/parcela/{id_parcele}")

@bottle.get("/dodaj-gosta/<id_rezervacije>")
def get_dodaj_gosta_na_rezervacijo(id_rezervacije):
    today = dt.date.today()
    tomorrow = today + dt.timedelta(days=1)
    
    rezervacija = dobi_rezervacijo_po_id(id_rezervacije)
    if not rezervacija:
        return template("error", sporocilo="Rezervacija ne obstaja!", naslov="Napaka")
    
    return template("dodajanje_gosta", id_rezervacije=id_rezervacije, today=today, tomorrow=tomorrow)

@bottle.post("/dodaj-gosta-na-rezervacijo")
def post_dodaj_gosta_na_rezervacijo():
    " V modelu rezervaciji doda gosta"

    # Preberemo lastnosti iz forme

    ime = request.forms.ime
    priimek = request.forms.priimek
    emso = request.forms.emso#get("")
    drzava = request.forms.drzava#get("")
    id_rezervacije = request.forms.rez#get("")
    od = request.forms.zacetek#get("")
    do = request.forms.konec#get("")
    try:
        datum_od = dt.datetime.fromisoformat(od).date()
        datum_do = dt.datetime.fromisoformat(do).date()
    except Exception as e:
        print(e)
        print("Napaka pri pretvorbi datumov")
        return redirect("/dodaj-gosta")


    rezervacija = dobi_rezervacijo_po_id(id_rezervacije)
    if not rezervacija:
        return template("error", sporocilo="Rezervacija ne obstaja!", naslov="Napaka")
    dodaj_gosta_na_rezervacijo(rezervacija.id_rezervacije, {
        "EMSO":emso,
        "ime":ime,
        "priimek":priimek,
        "drzava":drzava,
    },datum_od,datum_do)
    print(id_rezervacije)
    return redirect(f"/parcela/{rezervacija.id_parcele}")

@bottle.get("/predracun/<id_rezervacije>")
def predracun(id_rezervacije):
    rezervacija = dobi_rezervacijo_po_id(id_rezervacije)
    if not rezervacija:
        return template("error", sporocilo="Rezervacija ne obstaja!", naslov="Napaka")
    today = dt.date.today()
    gostje = rezervacija.gostje
    sestevek, postavke = dobi_postavke_racuna(rezervacija)
    slovar_cen = {}
    slovar_kolicin = {}
    for gost in gostje:
        slovar_kolicin[gost] = len(gost.nocitve)
        slovar_cen[gost] = format(gost.cena_nocitve() * slovar_kolicin.get(gost), '.2f')
    return template("racun", id_rezervacije=id_rezervacije, sestevek=format(sestevek, '.2f'), gostje=gostje, today=today.strftime("%d/%m/%Y"), slovar_cen=slovar_cen, slovar_kolicin=slovar_kolicin)

@bottle.get("/zakljuci/<id_rezervacije>")
def racun(id_rezervacije):
    rezervacija = dobi_rezervacijo_po_id(id_rezervacije)
    if not rezervacija:
        return template("error", sporocilo="Rezervacija ne obstaja!", naslov="Napaka")
    today = dt.date.today()
    gostje = rezervacija.gostje
    sestevek, postavke = zakljuci_na_datum_in_placaj(rezervacija, dt.date.today())
    slovar_cen = {}
    slovar_kolicin = {}
    for gost in gostje:
        slovar_kolicin[gost] = len(gost.nocitve)
        slovar_cen[gost] = format(gost.cena_nocitve() * slovar_kolicin.get(gost), '.2f')
    return template("racun", id_rezervacije=id_rezervacije, sestevek=format(sestevek, '.2f'), gostje=gostje, today=today.strftime("%d/%m/%Y"), slovar_cen=slovar_cen, slovar_kolicin=slovar_kolicin)

@bottle.error(404)
def napaka404(a):
    return template("error", sporocilo="Stran ne obstaja!", naslov="404")

@bottle.error(500)
def napaka500(a):
    return template("error", sporocilo="Napaka streznika!", naslov="500")

bottle.run(reloader=True, debug=True)

[((7, 1, 7, 16), 'bottle.get', 'bottle.get', ({(7, 12, 7, 15): '"""/"""'}, {}), "('/')", False, 'import bottle\n'), ((11, 1, 11, 21), 'bottle.get', 'bottle.get', ({(11, 12, 11, 20): '"""/domov"""'}, {}), "('/domov')", False, 'import bottle\n'), ((16, 1, 16, 36), 'bottle.get', 'bottle.get', ({(16, 12, 16, 35): '"""/parcela/<id_parcele>"""'}, {}), "('/parcela/<id_parcele>')", False, 'import bottle\n'), ((27, 1, 27, 47), 'bottle.get', 'bottle.get', ({(27, 12, 27, 46): '"""/naredi-rezervacijo/<id_parcele>"""'}, {}), "('/naredi-rezervacijo/<id_parcele>')", False, 'import bottle\n'), ((34, 1, 34, 35), 'bottle.post', 'bottle.post', ({(34, 13, 34, 34): '"""/naredi-rezervacijo"""'}, {}), "('/naredi-rezervacijo')", False, 'import bottle\n'), ((66, 1, 66, 44), 'bottle.get', 'bottle.get', ({(66, 12, 66, 43): '"""/dodaj-gosta/<id_rezervacije>"""'}, {}), "('/dodaj-gosta/<id_rezervacije>')", False, 'import bottle\n'), ((77, 1, 77, 43), 'bottle.post', 'bottle.post', ({(77, 13, 77, 42): '"""/dodaj-gosta-na-rezervacijo"""'}, {}), "('/dodaj-gosta-na-rezervacijo')", False, 'import bottle\n'), ((111, 1, 111, 42), 'bottle.get', 'bottle.get', ({(111, 12, 111, 41): '"""/predracun/<id_rezervacije>"""'}, {}), "('/predracun/<id_rezervacije>')", False, 'import bottle\n'), ((126, 1, 126, 41), 'bottle.get', 'bottle.get', ({(126, 12, 126, 40): '"""/zakljuci/<id_rezervacije>"""'}, {}), "('/zakljuci/<id_rezervacije>')", False, 'import bottle\n'), ((141, 1, 141, 18), 'bottle.error', 'bottle.error', ({(141, 14, 141, 17): '(404)'}, {}), '(404)', False, 'import bottle\n'), ((145, 1, 145, 18), 'bottle.error', 'bottle.error', ({(145, 14, 145, 17): '(500)'}, {}), '(500)', False, 'import bottle\n'), ((149, 0, 149, 37), 'bottle.run', 'bottle.run', (), '', False, 'import bottle\n'), ((9, 4, 9, 22), 'bottle.redirect', 'redirect', ({(9, 13, 9, 21): '"""/domov"""'}, {}), "('/domov')", False, 'from bottle import TEMPLATE_PATH, route, run, template, redirect, get, post, request, response, auth_basic, Bottle, abort, error, static_file\n'), ((14, 11, 14, 68), 'bottle.template', 'template', (), '', False, 'from bottle import TEMPLATE_PATH, route, run, template, redirect, get, post, request, response, auth_basic, Bottle, abort, error, static_file\n'), ((24, 11, 24, 100), 'bottle.template', 'template', (), '', False, 'from bottle import TEMPLATE_PATH, route, run, template, redirect, get, post, request, response, auth_basic, Bottle, abort, error, static_file\n'), ((30, 12, 30, 27), 'datetime.date.today', 'dt.date.today', ({}, {}), '()', True, 'import datetime as dt\n'), ((32, 11, 32, 94), 'bottle.template', 'template', (), '', False, 'from bottle import TEMPLATE_PATH, route, run, template, redirect, get, post, request, response, auth_basic, Bottle, abort, error, static_file\n'), ((57, 18, 57, 48), 'controller.naredi_rezervacijo', 'naredi_rezervacijo', ({(57, 37, 57, 47): 'id_parcele'}, {}), '(id_parcele)', False, 'from controller import dobi_parcele_za_prikaz, dobi_info_parcele, dodaj_gosta_na_rezervacijo, naredi_rezervacijo, dobi_rezervacijo_po_id, zakljuci_na_datum_in_placaj, dobi_postavke_racuna\n'), ((58, 4, 63, 26), 'controller.dodaj_gosta_na_rezervacijo', 'dodaj_gosta_na_rezervacijo', ({(58, 31, 58, 57): 'rezervacija.id_rezervacije', (58, 59, 63, 5): "{'EMSO': emso, 'ime': ime, 'priimek': priimek, 'drzava': drzava}", (63, 7, 63, 15): 'datum_od', (63, 17, 63, 25): 'datum_do'}, {}), "(rezervacija.id_rezervacije, {'EMSO': emso, 'ime':\n    ime, 'priimek': priimek, 'drzava': drzava}, datum_od, datum_do)", False, 'from controller import dobi_parcele_za_prikaz, dobi_info_parcele, dodaj_gosta_na_rezervacijo, naredi_rezervacijo, dobi_rezervacijo_po_id, zakljuci_na_datum_in_placaj, dobi_postavke_racuna\n'), ((64, 11, 64, 45), 'bottle.redirect', 'redirect', ({(64, 20, 64, 44): 'f"""/parcela/{id_parcele}"""'}, {}), "(f'/parcela/{id_parcele}')", False, 'from bottle import TEMPLATE_PATH, route, run, template, redirect, get, post, request, response, auth_basic, Bottle, abort, error, static_file\n'), ((68, 12, 68, 27), 'datetime.date.today', 'dt.date.today', ({}, {}), '()', True, 'import datetime as dt\n'), ((71, 18, 71, 56), 'controller.dobi_rezervacijo_po_id', 'dobi_rezervacijo_po_id', ({(71, 41, 71, 55): 'id_rezervacije'}, {}), '(id_rezervacije)', False, 'from controller import dobi_parcele_za_prikaz, dobi_info_parcele, dodaj_gosta_na_rezervacijo, naredi_rezervacijo, dobi_rezervacijo_po_id, zakljuci_na_datum_in_placaj, dobi_postavke_racuna\n'), ((75, 11, 75, 101), 'bottle.template', 'template', (), '', False, 'from bottle import TEMPLATE_PATH, route, run, template, redirect, get, post, request, response, auth_basic, Bottle, abort, error, static_file\n'), ((99, 18, 99, 56), 'controller.dobi_rezervacijo_po_id', 'dobi_rezervacijo_po_id', ({(99, 41, 99, 55): 'id_rezervacije'}, {}), '(id_rezervacije)', False, 'from controller import dobi_parcele_za_prikaz, dobi_info_parcele, dodaj_gosta_na_rezervacijo, naredi_rezervacijo, dobi_rezervacijo_po_id, zakljuci_na_datum_in_placaj, dobi_postavke_racuna\n'), ((102, 4, 107, 24), 'controller.dodaj_gosta_na_rezervacijo', 'dodaj_gosta_na_rezervacijo', ({(102, 31, 102, 57): 'rezervacija.id_rezervacije', (102, 59, 107, 5): "{'EMSO': emso, 'ime': ime, 'priimek': priimek, 'drzava': drzava}", (107, 6, 107, 14): 'datum_od', (107, 15, 107, 23): 'datum_do'}, {}), "(rezervacija.id_rezervacije, {'EMSO': emso, 'ime':\n    ime, 'priimek': priimek, 'drzava': drzava}, datum_od, datum_do)", False, 'from controller import dobi_parcele_za_prikaz, dobi_info_parcele, dodaj_gosta_na_rezervacijo, naredi_rezervacijo, dobi_rezervacijo_po_id, zakljuci_na_datum_in_placaj, dobi_postavke_racuna\n'), ((109, 11, 109, 57), 'bottle.redirect', 'redirect', ({(109, 20, 109, 56): 'f"""/parcela/{rezervacija.id_parcele}"""'}, {}), "(f'/parcela/{rezervacija.id_parcele}')", False, 'from bottle import TEMPLATE_PATH, route, run, template, redirect, get, post, request, response, auth_basic, Bottle, abort, error, static_file\n'), ((113, 18, 113, 56), 'controller.dobi_rezervacijo_po_id', 'dobi_rezervacijo_po_id', ({(113, 41, 113, 55): 'id_rezervacije'}, {}), '(id_rezervacije)', False, 'from controller import dobi_parcele_za_prikaz, dobi_info_parcele, dodaj_gosta_na_rezervacijo, naredi_rezervacijo, dobi_rezervacijo_po_id, zakljuci_na_datum_in_placaj, dobi_postavke_racuna\n'), ((116, 12, 116, 27), 'datetime.date.today', 'dt.date.today', ({}, {}), '()', True, 'import datetime as dt\n'), ((118, 25, 118, 58), 'controller.dobi_postavke_racuna', 'dobi_postavke_racuna', ({(118, 46, 118, 57): 'rezervacija'}, {}), '(rezervacija)', False, 'from controller import dobi_parcele_za_prikaz, dobi_info_parcele, dodaj_gosta_na_rezervacijo, naredi_rezervacijo, dobi_rezervacijo_po_id, zakljuci_na_datum_in_placaj, dobi_postavke_racuna\n'), ((128, 18, 128, 56), 'controller.dobi_rezervacijo_po_id', 'dobi_rezervacijo_po_id', ({(128, 41, 128, 55): 'id_rezervacije'}, {}), '(id_rezervacije)', False, 'from controller import dobi_parcele_za_prikaz, dobi_info_parcele, dodaj_gosta_na_rezervacijo, naredi_rezervacijo, dobi_rezervacijo_po_id, zakljuci_na_datum_in_placaj, dobi_postavke_racuna\n'), ((131, 12, 131, 27), 'datetime.date.today', 'dt.date.today', ({}, {}), '()', True, 'import datetime as dt\n'), ((143, 11, 143, 73), 'bottle.template', 'template', (), '', False, 'from bottle import TEMPLATE_PATH, route, run, template, redirect, get, post, request, response, auth_basic, Bottle, abort, error, static_file\n'), ((147, 11, 147, 73), 'bottle.template', 'template', (), '', False, 'from bottle import TEMPLATE_PATH, route, run, template, redirect, get, post, request, response, auth_basic, Bottle, abort, error, static_file\n'), ((13, 37, 13, 52), 'datetime.date.today', 'dt.date.today', ({}, {}), '()', True, 'import datetime as dt\n'), ((19, 48, 19, 63), 'datetime.date.today', 'dt.date.today', ({}, {}), '()', True, 'import datetime as dt\n'), ((31, 23, 31, 43), 'datetime.timedelta', 'dt.timedelta', (), '', True, 'import datetime as dt\n'), ((69, 23, 69, 43), 'datetime.timedelta', 'dt.timedelta', (), '', True, 'import datetime as dt\n'), ((73, 15, 73, 86), 'bottle.template', 'template', (), '', False, 'from bottle import TEMPLATE_PATH, route, run, template, redirect, get, post, request, response, auth_basic, Bottle, abort, error, static_file\n'), ((101, 15, 101, 86), 'bottle.template', 'template', (), '', False, 'from bottle import TEMPLATE_PATH, route, run, template, redirect, get, post, request, response, auth_basic, Bottle, abort, error, static_file\n'), ((115, 15, 115, 86), 'bottle.template', 'template', (), '', False, 'from bottle import TEMPLATE_PATH, route, run, template, redirect, get, post, request, response, auth_basic, Bottle, abort, error, static_file\n'), ((130, 15, 130, 86), 'bottle.template', 'template', (), '', False, 'from bottle import TEMPLATE_PATH, route, run, template, redirect, get, post, request, response, auth_basic, Bottle, abort, error, static_file\n'), ((133, 66, 133, 81), 'datetime.date.today', 'dt.date.today', ({}, {}), '()', True, 'import datetime as dt\n'), ((55, 15, 55, 46), 'bottle.redirect', 'redirect', ({(55, 24, 55, 45): '"""/naredi-rezervacijo"""'}, {}), "('/naredi-rezervacijo')", False, 'from bottle import TEMPLATE_PATH, route, run, template, redirect, get, post, request, response, auth_basic, Bottle, abort, error, static_file\n'), ((96, 15, 96, 39), 'bottle.redirect', 'redirect', ({(96, 24, 96, 38): '"""/dodaj-gosta"""'}, {}), "('/dodaj-gosta')", False, 'from bottle import TEMPLATE_PATH, route, run, template, redirect, get, post, request, response, auth_basic, Bottle, abort, error, static_file\n'), ((50, 19, 50, 48), 'datetime.datetime.fromisoformat', 'dt.datetime.fromisoformat', ({(50, 45, 50, 47): 'od'}, {}), '(od)', True, 'import datetime as dt\n'), ((51, 19, 51, 48), 'datetime.datetime.fromisoformat', 'dt.datetime.fromisoformat', ({(51, 45, 51, 47): 'do'}, {}), '(do)', True, 'import datetime as dt\n'), ((91, 19, 91, 48), 'datetime.datetime.fromisoformat', 'dt.datetime.fromisoformat', ({(91, 45, 91, 47): 'od'}, {}), '(od)', True, 'import datetime as dt\n'), ((92, 19, 92, 48), 'datetime.datetime.fromisoformat', 'dt.datetime.fromisoformat', ({(92, 45, 92, 47): 'do'}, {}), '(do)', True, 'import datetime as dt\n')]