'''
Created on Jul 24, 2014
@author: Brett Paufler
Copyright Brett Paufler

TODO: NEED TO REFORMAT ANNOTATE
    But not today



                        NEED TO ADD PASSWORD

#TODO - one of these days, add error documents to output, as well

CUSTOM 7z batch utility auto back up the noted catalogue_computer paths

'''

import subprocess
import os

from collections import namedtuple

DESKTOP = r'C:\Users\DATA\Desktop'
BACKUP = r'C:\Users\DATA\Desktop\BACKUP'
PASSWORD = ''

back_up_data = namedtuple('back_up_data', ['name', 'file_in', 'file_out'])


def make_back_up_data(base, sub=None):

    name = '_'.join([base, sub]) if sub else base
    
    if sub:
        file_in = os.path.join(DESKTOP, base, sub)
    else:
        file_in = os.path.join(DESKTOP, base, '*.*')
        
    file_out = os.path.join(BACKUP, '%s.7z' % name)
    
    f_data = back_up_data(name, file_in, file_out)
    return f_data




dirs_in = ['TODO', 'FINANCE', 'WRITING', 'PHOTOS', 'PHOTO_NEW',]


dirs_base = [make_back_up_data(base_folder) for base_folder in dirs_in]

dirs_sub = [make_back_up_data(base_folder, sub_folder)
            for base_folder in dirs_in
            for sub_folder in os.listdir(os.path.join(DESKTOP, base_folder))
            if os.path.isdir(os.path.join(DESKTOP, base_folder, sub_folder))]

possible_back_ups = dirs_base + dirs_sub

file_out_existing = [f[:-3] for f in os.listdir(BACKUP) if f.endswith('7z')]
print file_out_existing
back_ups_to_run = [b for b in possible_back_ups
                   if b.name not in file_out_existing]

errors = []

for b in back_ups_to_run:
    
    password = '_'.join([PASSWORD, b.name])
            
    command = [r"C:\Program Files\7-Zip\7z.exe", #path_in to 7z
           'a', #archive,
           #'-r-', #no recurse
           '-mhe=on', #hides files structure without password
           '-p%s' % password,
           b.file_out, #os.path.join(BACKUP, 'test.7z'), #destination
           b.file_in, #os.path.join(DESKTOP, 'test', '*.*'), #source
        ]

    print ' '.join(command)
    error_value = subprocess.call(command)
    
    if error_value:
        errors.append((error_value, b.name))

    print b


for error in errors:
    print errors

'''
for zipFile in filesToZip:
    zipSave = zipFile + '7z.7z'
    cmd = [r"C:\Program Files (x86)\7-Zip\7z.exe",
            'a',
            '-mx5',
            '-mhe=on',
            '-pfred %s' % PASSWORD,
            zipFile,
            zipFile
            ]

    a = subprocess.call(cmd)
    feedbackText = "%d    for %s     (0 is Good)\n" % (a, zipFile)
    feedback.append(feedbackText)
    if a != 0:
        problem = True
'''

errorCodes = '''

Error Codes
0    Okey Dokey
1    Problems: a locked file, most likely
2    Crash
7    Check Command Syntax
8    Get a Better Computer
255    User Terminated'''

#feedback.append(errorCodes)


#if problem:
#    sN = r'C:\ TODO 7z-FAIL-log.txt'
#else:
#    sN = r'C:\ Full Path Needed 7z-OK-Feedback-File.txt'


#with open(sN,'w' ) as feedFile:
#    for fB in feedback:
#        feedFile.write(fB)


#print feedback


#filesToZip = [          
#              r'C:\ TODO',  
#              r'C:\ obfuscated\FINANCE',
#              r'C:\ ditto WRITING',
#              r'C:\ seems silly not to change \WEBSITES',
#              r'C:\ paranoia runs deep \PHOTOS',
#              r'C:\ so these directories \PROGRAMS',
#              ]

#feedback = []
#problem = False