# Persistencia (pickle, json)

import datetime as dt
import pickle
import json


class DefaultEncoder(json.JSONEncoder):
    def default(self, o):
        return o.__dict__


class Nota:
    def __init__(self, anyo=0, mes=0, dia=0, hora=0, contenido=""):
        self._anyo = anyo
        self._mes = mes
        self._dia = dia
        self._hora = hora
        self._contenido = contenido

    @property
    def contenido(self):
        return self._contenido
        
    @property
    def fecha(self):
        return dt.datetime(self._anyo,
                           self._mes,
                           self._dia,
                           self._hora,
                           0,
                           self.contenido)

    def __str__(self):
        return (str(self._anyo)
                + "-" + str(self._mes)
                + "-" + str(self._dia)
                + " " + str(self._hora) + ":00"
                + " -> " + self.contenido)

    @staticmethod
    def guarda_notas_json(fn, lnotas):
        with open(fn, "wt") as f:
            json.dump(lnotas, f, cls=DefaultEncoder)

    @staticmethod
    def recupera_notas_json(fn):
        toret = []

        with open(fn, "rU") as f:
            lnotas = json.load(f)

        for d in lnotas:
            n = Nota()
            n.__dict__ = d
            toret.append(n)

        return toret

    @staticmethod
    def guarda_notas(fn, lnotas):
        with open(fn, "wb") as f:
            pickle.dump(lnotas, f)

    @staticmethod
    def recupera_notas(fn):
        toret = []
        with open(fn, "rb") as f:
            toret = pickle.load(f)

        return toret


def guarda():
    nota = Nota(2018, 3, 23, 9, "Venir a clases")
    Nota.guarda_notas("notas.dat", [nota])


def recupera():
    return Nota.recupera_notas("notas.dat")


def guarda_json():
    nota = Nota(2018, 3, 23, 9, "Venir a clases")
    Nota.guarda_notas_json("notas_json.txt", [nota])


def recupera_json():
    return Nota.recupera_notas_json("notas_json.txt")

if __name__ == "__main__":
    guarda_json()
    lnotas = recupera_json()
    for nota in lnotas:
        print(nota)
