#!python
import os
import sys
import getpass
import logging
import argparse

import requests

import tarfile

## argparse arguments
parser = argparse.ArgumentParser(description="Python backup utility")

## Backup subparser
parser.add_argument('--path', help='path(s) to backup', metavar='PATH', nargs='+', required='True')
parser.add_argument('--dest', help='destination of backup', metavar='DEST', required='True')
parser.add_argument('--webdav', help='WebDav URL to upload to', metavar='URL')
parser.add_argument('-z', '--zip', help='use gzip to compress the backup file', action="store_true")
parser.add_argument('-v', '--verbose', help='enable verbose output', action="store_true")
parser.add_argument('-q', '--quiet', help='suppress output', action="store_true")

args = parser.parse_args()

log = logging.getLogger(__name__)


def check_dest(dest):
    dir = os.path.dirname(dest)
    if not os.path.isdir(dir):
        log.error('Invalid dest: ' + dest)
        sys.exit(1)


def webdav_upload(file, url):
    if not 'remote.php/dav' in url:
        url = url + '/remote.php/dav'
    username = input('WebDav Username: ')
    password = getpass.getpass('WebDav Password: ')
    url = url + '/files/' + username + '/'
    webdav_path = input('Remote Path: ')
    url = url + webdav_path
    with open(file) as fh:
        file_data = fh.read()
        response = requests.put(str(url), data=file_data, auth=(str(username), str(password)), headers={'content-type':'text/plain'}, params={'file': str(file)}) 
     

def backup(paths, dest):
    if args.zip:
        tar = tarfile.open(name=dest, mode='w:gz')
    else:
        tar = tarfile.open(name=dest, mode='w')
    for path in paths:
        if os.path.isfile(path):
            path_status = 'True'
        elif os.path.isdir(path):
            path_status = 'True'
        else:
            log.error('Invalid path. Skipping: ' + path)
            path_status = 'False'
        if path_status == 'True':
            if args.verbose:
                if args.quiet:
                    log.error('Cannot use verbose and quiet arguments simultaneously.')
                    log.info('Quitting.')
                    sys.exit(1)
                log.info(path + ' => ' + dest)
            elif args.quiet:
                if args.verbose:
                    log.error('Cannot use verbose and quiet arguments simultaneously.')
                    log.info('Quitting.')
                    sys.exit(1)
            else:
                log.info(path)
            tar.add(path)
    tar.close()

def main():
    check_dest(args.dest)
    dest = args.dest
    if not '.tar' in dest:
        dest = str(dest) + '.tar'
    if args.zip:
        if not '.gz' in dest:
            dest = str(dest) + '.gz'
    backup(args.path, dest)
    if args.webdav:
        webdav_upload(dest, args.webdav)

if __name__ == '__main__':
    main()
