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, 'bottle.get', 'bottle.get', (['"""/"""'], {}), False, 'import bottle\n'), (11, 'bottle.get', 'bottle.get', (['"""/domov"""'], {}), False, 'import bottle\n'), (16, 'bottle.get', 'bottle.get', (['"""/parcela/<id_parcele>"""'], {}), False, 'import bottle\n'), (27, 'bottle.get', 'bottle.get', (['"""/naredi-rezervacijo/<id_parcele>"""'], {}), False, 'import bottle\n'), (34, 'bottle.post', 'bottle.post', (['"""/naredi-rezervacijo"""'], {}), False, 'import bottle\n'), (66, 'bottle.get', 'bottle.get', (['"""/dodaj-gosta/<id_rezervacije>"""'], {}), False, 'import bottle\n'), (77, 'bottle.post', 'bottle.post', (['"""/dodaj-gosta-na-rezervacijo"""'], {}), False, 'import bottle\n'), (111, 'bottle.get', 'bottle.get', (['"""/predracun/<id_rezervacije>"""'], {}), False, 'import bottle\n'), (126, 'bottle.get', 'bottle.get', (['"""/zakljuci/<id_rezervacije>"""'], {}), False, 'import bottle\n'), (141, 'bottle.error', 'bottle.error', (['(404)'], {}), False, 'import bottle\n'), (145, 'bottle.error', 'bottle.error', (['(500)'], {}), False, 'import bottle\n'), (149, 'bottle.run', 'bottle.run', ([], {'reloader': '(True)', 'debug': '(True)'}), False, 'import bottle\n'), (9, 'bottle.redirect', 'redirect', (['"""/domov"""'], {}), False, 'from bottle import TEMPLATE_PATH, route, run, template, redirect, get, post, request, response, auth_basic, Bottle, abort, error, static_file\n'), (14, 'bottle.template', 'template', (['"""domov"""'], {'parcele': 'parcele', 'hide_header_back': '(True)'}), False, 'from bottle import TEMPLATE_PATH, route, run, template, redirect, get, post, request, response, auth_basic, Bottle, abort, error, static_file\n'), (24, 'bottle.template', 'template', (['"""parcela"""'], {'id_parcela': 'id_parcele', 'rezervacija': 'rez', 'stanje': 'stanje', 'gostje': 'gostje'}), False, 'from bottle import TEMPLATE_PATH, route, run, template, redirect, get, post, request, response, auth_basic, Bottle, abort, error, static_file\n'), (30, 'datetime.date.today', 'dt.date.today', ([], {}), True, 'import datetime as dt\n'), (32, 'bottle.template', 'template', (['"""nova_rezervacija"""'], {'id_parcele': 'id_parcele', 'today': 'today', 'tomorrow': 'tomorrow'}), False, 'from bottle import TEMPLATE_PATH, route, run, template, redirect, get, post, request, response, auth_basic, Bottle, abort, error, static_file\n'), (57, 'controller.naredi_rezervacijo', 'naredi_rezervacijo', (['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, 'controller.dodaj_gosta_na_rezervacijo', 'dodaj_gosta_na_rezervacijo', (['rezervacija.id_rezervacije', "{'EMSO': emso, 'ime': 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, 'bottle.redirect', 'redirect', (['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, 'datetime.date.today', 'dt.date.today', ([], {}), True, 'import datetime as dt\n'), (71, 'controller.dobi_rezervacijo_po_id', 'dobi_rezervacijo_po_id', (['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, 'bottle.template', 'template', (['"""dodajanje_gosta"""'], {'id_rezervacije': 'id_rezervacije', 'today': 'today', 'tomorrow': 'tomorrow'}), False, 'from bottle import TEMPLATE_PATH, route, run, template, redirect, get, post, request, response, auth_basic, Bottle, abort, error, static_file\n'), (99, 'controller.dobi_rezervacijo_po_id', 'dobi_rezervacijo_po_id', (['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, 'controller.dodaj_gosta_na_rezervacijo', 'dodaj_gosta_na_rezervacijo', (['rezervacija.id_rezervacije', "{'EMSO': emso, 'ime': 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, 'bottle.redirect', 'redirect', (['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, 'controller.dobi_rezervacijo_po_id', 'dobi_rezervacijo_po_id', (['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, 'datetime.date.today', 'dt.date.today', ([], {}), True, 'import datetime as dt\n'), (118, 'controller.dobi_postavke_racuna', 'dobi_postavke_racuna', (['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, 'controller.dobi_rezervacijo_po_id', 'dobi_rezervacijo_po_id', (['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, 'datetime.date.today', 'dt.date.today', ([], {}), True, 'import datetime as dt\n'), (143, 'bottle.template', 'template', (['"""error"""'], {'sporocilo': '"""Stran ne obstaja!"""', 'naslov': '"""404"""'}), False, 'from bottle import TEMPLATE_PATH, route, run, template, redirect, get, post, request, response, auth_basic, Bottle, abort, error, static_file\n'), (147, 'bottle.template', 'template', (['"""error"""'], {'sporocilo': '"""Napaka streznika!"""', 'naslov': '"""500"""'}), False, 'from bottle import TEMPLATE_PATH, route, run, template, redirect, get, post, request, response, auth_basic, Bottle, abort, error, static_file\n'), (13, 'datetime.date.today', 'dt.date.today', ([], {}), True, 'import datetime as dt\n'), (19, 'datetime.date.today', 'dt.date.today', ([], {}), True, 'import datetime as dt\n'), (31, 'datetime.timedelta', 'dt.timedelta', ([], {'days': '(1)'}), True, 'import datetime as dt\n'), (69, 'datetime.timedelta', 'dt.timedelta', ([], {'days': '(1)'}), True, 'import datetime as dt\n'), (73, 'bottle.template', 'template', (['"""error"""'], {'sporocilo': '"""Rezervacija ne obstaja!"""', 'naslov': '"""Napaka"""'}), False, 'from bottle import TEMPLATE_PATH, route, run, template, redirect, get, post, request, response, auth_basic, Bottle, abort, error, static_file\n'), (101, 'bottle.template', 'template', (['"""error"""'], {'sporocilo': '"""Rezervacija ne obstaja!"""', 'naslov': '"""Napaka"""'}), False, 'from bottle import TEMPLATE_PATH, route, run, template, redirect, get, post, request, response, auth_basic, Bottle, abort, error, static_file\n'), (115, 'bottle.template', 'template', (['"""error"""'], {'sporocilo': '"""Rezervacija ne obstaja!"""', 'naslov': '"""Napaka"""'}), False, 'from bottle import TEMPLATE_PATH, route, run, template, redirect, get, post, request, response, auth_basic, Bottle, abort, error, static_file\n'), (130, 'bottle.template', 'template', (['"""error"""'], {'sporocilo': '"""Rezervacija ne obstaja!"""', 'naslov': '"""Napaka"""'}), False, 'from bottle import TEMPLATE_PATH, route, run, template, redirect, get, post, request, response, auth_basic, Bottle, abort, error, static_file\n'), (133, 'datetime.date.today', 'dt.date.today', ([], {}), True, 'import datetime as dt\n'), (55, 'bottle.redirect', 'redirect', (['"""/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, 'bottle.redirect', 'redirect', (['"""/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, 'datetime.datetime.fromisoformat', 'dt.datetime.fromisoformat', (['od'], {}), True, 'import datetime as dt\n'), (51, 'datetime.datetime.fromisoformat', 'dt.datetime.fromisoformat', (['do'], {}), True, 'import datetime as dt\n'), (91, 'datetime.datetime.fromisoformat', 'dt.datetime.fromisoformat', (['od'], {}), True, 'import datetime as dt\n'), (92, 'datetime.datetime.fromisoformat', 'dt.datetime.fromisoformat', (['do'], {}), True, 'import datetime as dt\n')]