#!/usr/bin/env python

"""
dump the dictionary generated from findings into a yaml file for later inspection
"""

import os
import yaml
from tqdm import tqdm

### Local Imports
# from configure import Configure, CONFIG_FILE
from hashing import xx_hash
from lumberjack import timber

def check_log_dir(d):
        create_folder(d)


# c = Configure(CONFIG_FILE)
# config = c.load_config()
log = timber(__name__)
log.info("Starting")

def dump_yaml(dictionary,file):
    """ dump dictionary to yaml file """
    with open(file, 'w', encoding="utf-8") as f:
        yaml.dump(dictionary, f)

    f.close()

def path_exists(p):
    """ determine if the path exists """
    log.debug(f'path_exists({p})')
    pe = os.path.exists(p)
    # print(f'Path Exists: {pe}')

    return pe

def is_dir(d):
    """ determine if object is a dir or not """
    log.debug(f'is_dir({d})')

    return os.path.isdir(d)

def is_file(f):
    """ determine if object is a file or not """
    log.debug(f'is_file({f})')

    return os.path.isfile(f)

def cmp_files(f1,f2):
    """ compare two files """
    log.debug(f'cmp_files({f1},{f2})')
    #TODO: Determine if path is actually a file
    #TODO: Determine if the hash has already been stored and use it if so

    hash1 = xx_hash(f1)
    hash2 = xx_hash(f2)
    return hash1 == hash2

def path_access_read(path):
    """ make sure we can read from the path """
    log.debug(f'path_access_read({path})')

    val = os.access(path, os.R_OK)

    if val is False:
        log.error(f'Can not read from {path}')

    return val

def path_access_write(path):
    """ make sure we can write to the path """
    log.debug(f'path_access_write({path})')

    val = os.access(path, os.W_OK)

    if val is False:
        log.error(f'Can not write to {path}')

    return val

def create_folder(file):
    """ Function to create folder """
    log.debug(f'create_folder({file})')

    if path_exists(file) is False:
        os.makedirs(file)
    elif is_dir(file) is False:
        pass # this needs to turn into bailing out as there is a collision.

def cleanup_sd(f,config):
    """ If we should clean up the SD, nuke the copied files. """
    log.debug(f'cleanup_sd({f})')

    if config['cleanup_sd'] is True:
        os.system('clear')
        for file in tqdm(f, desc = "Cleaning Up SD:"):
            if f[file]['source_cleanable'] is True:
                log.debug(f"Cleanup SD: Removing File -\n{os.path.join(f[file]['folders']['source_path'],f[file]['name'])}")

                os.remove(os.path.join(f[file]['folders']['source_path'],f[file]['name']))
            else:
                log.debug(f"Cleanup SD: Not Removing File -\n{os.path.join(f[file]['folders']['source_path'],f[file]['name'])}")

def validate_config_dir_access(config):
    """ Validate we can operate in the defined directories """
    log.debug('validate_config_dir_access')

    check = path_access_write(config['folders']['destination']['base'])
    if check is False:
        accessible =  False
    else:
        check = path_access_read(config['folders']['source']['base'])
        if check is False:
            accessible = False
        else:
            if config['store_backup'] is True:
                check = path_access_write(config['folders']['backup'])
                if check is False:
                    accessible = False
                else:
                    accessible = True
            else:
                accessible = True
    return accessible

