#! /usr/bin/python3
#
#    Copyright (C) 2015 VMware, Inc. All rights reserved.
#    publishtool for working with photonpublish
#
#    Author(s): Priyesh Padmavilasom
#

import sys
import getopt

from photonpublish import photonPublish
from publishconst import publishConst

const = publishConst()

class publishTool:
    def __init__(self, context):
        self._context = context
        self._publish = photonPublish(context)

    #check local files against remote repo
    def check(self):
        result = self._publish.check(self._context['srcroot'])
        print('Updates: %d'   % len(result[const.updates]))
        print('New: %d'       % len(result[const.new]))
        print('Verified: %d'  % len(result[const.verified]))
        print('Obsoletes: %d' % len(result[const.obsoletes]))
        print('New files are : %s' %(result[const.new]))
        return result

    def hasPendingSync(self, advice):
        return advice[const.updates] or advice[const.new]

    #apply advices to sync remote.
    #note: discarding/removing is stll getting resolved pending bintray api
    def push(self):
        advice = self.check()
        if not self._context['silent']:
            if not self.hasPendingSync(advice):
                print('No changes to push.')
                return
            choice = input('Continue? y/N:')
            if choice != 'y':
                print('Aborted on user command')
                return
        print('push local changes to remote...')
        self._publish.syncRemote(self._context['srcroot'], advice)


    def printsha1(self, files, label):
        print('sha1sum of %s >>>' % label)
        for f in files:
            print('%s - %s' % (f['name'], f['sha1']))

    def makesha1(self):
        advice = self.check()
        verified = len(advice[const.verified])
        if verified <= 0:
            print('no files verified. nothing to do.')
            return
        self.printsha1(advice[const.verified], const.verified)

    def writesha1(self):
        if 'sha1file' not in self._context.keys():
            raise Exception('writesha1 requires a file to write to. specify in --sha1file')

        advice = self.check()
        verified = advice[const.verified]
        verifiedLen = len(advice[const.verified])
        if verifiedLen <= 0:
            print('no files verified. nothing to do.')
            return

        with open(self._context['sha1file'], 'w') as sha1file:
            for f in verified:
                if f['name'] == const.sha1allfilename:
                    continue
                sha1file.write('%s - %s\n' % (f['name'], f['sha1']))

    def publish(self):
        pending = self._publish.getUnpublished()
        pendingCount = len(pending)
        if not self._context['silent']:
            if pendingCount == 0:
                print('No pending changes to publish.')
                return
            print('Found %d pending files to publish' % pendingCount)
            choice = input('Continue? y/N:')
            if choice != 'y':
                print('Aborted on user command')
                return
            print(self._publish.publish())

def showUsage():
    print('Usage:')
    print('check status: publishTool.py \
--config <config file> --srcroot <source root folder> \
--action check')
    print('push files: publishTool.py \
--config <config file> --srcroot <source root folder> \
--action push')
    print('publish pushed files: publishTool.py \
--config <config file> folder> --action publish')
    print('make sha1 file: publishTool.py \
--config <config file> folder> --srcroot <source root folder> \
--action makesha1')
    print('write sha1 file: publishTool.py \
--config <config file> folder> --srcroot <source root folder> \
--sha1file <sha1 file path> --action writesha1')

#
def main(argv):
    try:
        context = {'silent':False}
        opts, args = getopt.getopt(
            sys.argv[1:],
            '',
            ['config=',
             'srcroot=',
             'action=',
             'sha1file=',
             'silent=',
             'help'])
        for opt, arg in opts:
            if opt == '--config':
                context['config'] = arg
            elif opt == '--srcroot':
                context['srcroot'] = arg
            elif opt == '--action':
                context['action'] = arg
            elif opt == '--silent':
                context['silent'] = arg
            elif opt == '--sha1file':
                context['sha1file'] = arg
            elif opt == '--help':
                showUsage()
                return
    except Exception as e:
        showUsage()
        sys.exit(1)

    try:
        tool = publishTool(context)
        if context['action'] == 'push':
            tool.push()
        elif context['action'] == 'check':
            tool.check()
        elif context['action'] == 'makesha1':
            tool.makesha1()
        elif context['action'] == 'writesha1':
            tool.writesha1()
        elif context['action'] == 'publish':
            tool.publish()
    except Exception as e:
        print("Error: %s" % e)
        sys.exit(1)


if __name__ == "__main__":
    main(sys.argv)