# -*- coding: utf-8 -*- 
import json
import os
import errno
from . import fabric
# from collections import namedtuple

def jdefault(o):
    return o.__dict__

def list_decoder(objs):
    """
    Function to parse the json list of dictionary into objects of TodoList.
    """
    # print(objs)
    twrap = fabric.TodoWrapper()
    twrap.createTime = objs['createTime']
    twrap.username = objs['username']
    twrap.cookie = objs['cookie']

    for obj in objs['tlist']:
        if '__type__' in obj and obj['__type__'] == 'Todo':
            objT = fabric.Todo(obj['content'], obj['tags'], obj['status'])
        else:
            objT = obj
        twrap.tlist.append(objT)
    return twrap

def load_file(filename):
    """
    Function to load datafiles, it returns a list of Todo
    """
    if not os.path.exists(os.path.dirname(filename)) and '/' in filename:
        try:
            os.makedirs(os.path.dirname(filename))
        except OSError as exc: # Guard against race condition
            if exc.errno != errno.EEXIST:
                raise
        return fabric.TodoWrapper()

    if os.path.isfile(filename):
        with open(filename, 'r+') as data_file:
            read_data = data_file.read()
            return list_decoder(json.loads(read_data))
    else:
        with open(filename, 'w') as data_file:
            return fabric.TodoWrapper()

def save_file(filename, data):
    """
    Function to save data <list of TodoList Objects> to a json file in json format 
    """
    with open(filename, 'w+') as data_file:
        jsondata = json.dumps(data, default=jdefault, indent=4)
        data_file.write(jsondata)