import json
import os
import sqlite3


def dodaj_osebo(conn, oseba):
    sql = '''
        INSERT INTO oseba
        (id, ime)
        VALUES
        (?, ?)
    '''
    parametri = [
        oseba['id'],
        oseba['ime'],
    ]
    conn.execute(sql, parametri)


def dodaj_vlogo(conn, film_id, oseba_id, tip, mesto):
    sql = '''
        INSERT INTO vloga
        (film, oseba, tip, mesto)
        VALUES
        (?, ?, ?, ?)
    '''
    parametri = [
        film_id,
        oseba_id,
        tip,
        mesto,
    ]
    conn.execute(sql, parametri)


def dodaj_zanr(conn, zanr):
    sql = '''
        INSERT INTO zanr
        (naziv)
        VALUES
        (?)
    '''
    parametri = [
        zanr,
    ]
    cur = conn.execute(sql, parametri)
    return cur.lastrowid


def dodaj_dolocitev_zanra(conn, film_id, zanr_id):
    sql = '''
        INSERT INTO pripada
        (film, zanr)
        VALUES
        (?, ?)
    '''
    parametri = [
        film_id,
        zanr_id,
    ]
    conn.execute(sql, parametri)


def dodaj_podatke_filma(conn, film):
    sql = '''
        INSERT INTO film
        (id, naslov, dolzina, leto, ocena, metascore, glasovi, zasluzek, oznaka, opis)
        VALUES
        (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    '''
    parametri = [
        film['id'],
        film['naslov'],
        film['dolzina'],
        film['leto'],
        film['ocena'],
        film['metascore'],
        film['glasovi'],
        film['zasluzek'],
        film['oznaka'],
        film['opis'],
    ]
    conn.execute(sql, parametri)


def dodaj_oznako(conn, oznaka, ze_videne_oznake):
    if oznaka is None or oznaka in ze_videne_oznake:
        return
    else:
        ze_videne_oznake.add(oznaka)
    sql = '''
        INSERT INTO oznaka
        (kratica)
        VALUES
        (?)
    '''
    parametri = [
        oznaka
    ]
    conn.execute(sql, parametri)


def dodaj_vloge(conn, film, osebe, tip, ze_videne_osebe):
    film_id = film['id']
    for mesto, oseba in enumerate(osebe, 1):
        oseba_id = oseba['id']
        if oseba_id not in ze_videne_osebe:
            dodaj_osebo(conn, oseba)
            ze_videne_osebe.add(oseba_id)
        dodaj_vlogo(conn, film_id, oseba_id, tip, mesto)


def dodaj_zanre(conn, film, zanri, idji_zanrov):
    film_id = film['id']
    for zanr in zanri:
        if zanr not in idji_zanrov:
            id_zanra = dodaj_zanr(conn, zanr)
            idji_zanrov[zanr] = id_zanra
        dodaj_dolocitev_zanra(conn, film_id, idji_zanrov[zanr])


def napolni_tabele(conn, filmi):
    ze_videne_osebe = set()
    idji_zanrov = {}
    ze_videne_oznake = set()
    for film in filmi:
        dodaj_oznako(conn, film['oznaka'], ze_videne_oznake)
        dodaj_podatke_filma(conn, film)
        dodaj_vloge(conn, film, film['igralci'], 'I', ze_videne_osebe)
        dodaj_vloge(conn, film, film['reziserji'], 'R', ze_videne_osebe)
        dodaj_zanre(conn, film, film['zanri'], idji_zanrov)
    conn.commit()


def naredi_bazo_filmov(pobrisi_ce_obstaja=False):
    IME_DATOTEKE_Z_BAZO = '../filmi.sqlite'
    IME_DATOTEKE_Z_SQL_UKAZI = 'filmi.sql'
    IME_DATOTEKE_S_PODATKI = 'filmi.json'
    # Naredimo prazno bazo
    if os.path.exists(IME_DATOTEKE_Z_BAZO):
        if pobrisi_ce_obstaja:
            os.remove(IME_DATOTEKE_Z_BAZO)
        else:
            print('Baza že obstaja in je ne bom spreminjal.')
            return
    conn = sqlite3.connect(IME_DATOTEKE_Z_BAZO)
    # Ustvarimo tabele iz DDL datoteke
    with open(IME_DATOTEKE_Z_SQL_UKAZI) as datoteka_z_sql_ukazi:
        ddl = datoteka_z_sql_ukazi.read()
        conn.executescript(ddl)
    # Naložimo podatke o filmih
    with open(IME_DATOTEKE_S_PODATKI) as datoteka_s_podatki:
        filmi = json.load(datoteka_s_podatki)
    napolni_tabele(conn, filmi)
    conn.execute('VACUUM')


naredi_bazo_filmov(pobrisi_ce_obstaja=True)
