#
#   Model (razreda Film in Oseba) k
#   programu
#         filmi_tekstovni_vmesnik.py
#   za delo z bazo filmi.sqlite
#
#   M. Lokar, dec. 2020
#   Prirejeno po M. Pretnar, 2019
#
import sqlite3

conn = sqlite3.connect('filmi.sqlite')


class Film:
    '''
        Opomba: lastnosti niso izvedene preko
        metod s @property - TODO!
    '''
        
    def __init__(self, idf, naslov, leto, ocena):
        self.id = idf
        self.naslov = naslov
        self.leto = leto
        self.ocena = ocena
    
    def __str__(self):
        return self.naslov

    @staticmethod
    def najboljsi_v_letu(leto):
        '''Vrne najboljših 10 filmov v danem letu.'''
        sql = '''
            SELECT id, naslov, leto, ocena
            FROM film
            WHERE leto = ?
            ORDER BY ocena DESC
            LIMIT 10
        '''
        film = []
        for idf, naslov, leto, ocena in conn.execute(sql, [leto]):
            film.append(Film(idf, naslov, leto, ocena))
        return film



class Oseba:
    '''
        Opomba: lastnosti niso izvedene preko
        metod s @property - TODO!
    '''
    def __init__(self, ido, ime):
        self.id = ido
        self.ime = ime
    
    def __str__(self):
        return self.ime

    def poisci_vloge(self):
        '''
           Vrni tabelo vseh filmov, kjer
           je oseba self imela vlogo, 
           urejeno po letih
        '''
        sql = '''
            SELECT film.naslov, film.leto, vloga.tip
            FROM film
                JOIN vloga ON film.id = vloga.film
            WHERE vloga.oseba = ?
            ORDER BY leto
        '''
        return conn.execute(sql, [self.id]).fetchall()

    @staticmethod
    def poisci(niz):
        '''Vrne vse osebe, ki v imenu vsebujejo dani niz.'''
        sql = '''
            SELECT id, ime FROM oseba WHERE ime LIKE ?
        '''
        osebe = []
        for ido, ime in conn.execute(sql, ['%' + niz + '%']):
            osebe.append(Oseba(ido, ime))
        return osebe

