#! /usr/bin/env python3
# -*- coding: UTF-8 -*-
##############################################
# Home	: https://www.netkiller.cn
# Author: Neo <netkiller@msn.com>
##############################################
import os
import sys
module = os.path.dirname(os.path.dirname(
    os.path.dirname(os.path.abspath(__file__))))
# print(module)
sys.path.insert(0, module)

try:
    from netkiller.gantt import Gantt, Data
    import json
    import csv
    import logging
    import logging.handlers
    from optparse import OptionParser, OptionGroup
    from datetime import datetime, date
    from mysql import connector
except ImportError as err:
    print("Error: %s" % (err))


class GanttChart:
    data = {}

    def __init__(self) -> None:

        self.parser = OptionParser("usage: %prog [options] ")
        self.parser.add_option("-t", "--title", dest="title", help="甘特图标题",
                               default='甘特图标题', metavar="项目甘特图")
        self.parser.add_option("-c", "--csv", dest="csv", help="/path/to/gantt.csv",
                               default=None, metavar="/path/to/gantt.csv")
        self.parser.add_option('-l', '--load', dest='load',
                               help='load data from file.', default=None, metavar='/path/to/gantt.json')
        group = OptionGroup(self.parser, "loading data from mysql")
        group.add_option('', '--host', dest='host', help='',
                         default=None, metavar='localhost')
        group.add_option('-u', '--username', dest='username',
                         help='', default=None, metavar='root')
        group.add_option('-p', '--password', dest='password',
                         help='', default=None, metavar='')
        group.add_option('', '--database', dest='database',
                         help='', default=None, metavar='test')
        self.parser.add_option_group(group)

        self.parser.add_option('-s', '--save', dest='save',
                               help='save file', default=None, metavar='/path/to/gantt.svg')
        self.parser.add_option(
            '', "--stdin", action="store_true", dest="stdin", help="cat gantt.json | gantt -s file.svg")
        self.parser.add_option(
            '-g', "--gantt", action="store_true", dest="gantt", default=True, help="Gantt chart")
        self.parser.add_option(
            '-w', "--workload", action="store_true", dest="workload", help="Workload chart")
        self.parser.add_option(
            '-d', "--debug", action="store_true", dest="debug", help="debug mode")

        self.gantt = Gantt()
        # self.gantt.hideTable()

    def usage(self):
        self.parser.print_help()
        print("\nHomepage: https://www.netkiller.cn\tAuthor: Neo <netkiller@msn.com>")
        print("Help: https://github.com/netkiller/devops/blob/master/doc/gantt/index.md")
        exit()

    def __gantt2workload(self, jsonData):

        for key, item in jsonData.items():
            if 'subitem' in item:
                self.__gantt2workload(item['subitem'])

            if not 'resource' in item:
                continue
            elif not item['resource']:
                item['resource'] = 'null'

            if item['resource'] in self.data.keys():
                # if data.has_key(item['resource']):
                start = datetime.strptime(
                    item['start'], '%Y-%m-%d').date()
                finish = datetime.strptime(
                    item['finish'], '%Y-%m-%d').date()

                # if not 'start' in tmp[item['resource']]:
                # tmp[item['resource']]['start']=''
                if datetime.strptime(self.data[item['resource']]['start'], '%Y-%m-%d').date() > start:
                    self.data[item['resource']]['start'] = item['start']
                if datetime.strptime(self.data[item['resource']]['finish'], '%Y-%m-%d').date() < finish:
                    self.data[item['resource']]['finish'] = item['finish']
            else:
                self.data[item['resource']] = {
                    'resource': item['resource'], 'start': item['start'], 'finish': item['finish']}

    def loadFromMySQL(self, config):

        try:
            cnx = connector.connect(**config)
            cursor = cnx.cursor(dictionary=True)
            query = ("SELECT * FROM project")

            # WHERE hire_date BETWEEN %s AND %s
            # hire_start = datetime.date(1999, 1, 1)
            # hire_end = datetime.date(1999, 12, 31)
            # cursor.execute(query, (hire_start, hire_end))
            cursor.execute(query)
            tmp = Data()
            for row in cursor:
                # print("{}, {} was hired on {:%d %b %Y}".format(                    last_name, first_name, hire_date))
                tmp.addFromMySQL(row)

            cursor.close()
            cnx.close()
            self.data = tmp.data
        except connector.Error as err:
            if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
                print(err)
            elif err.errno == errorcode.ER_BAD_DB_ERROR:
                print("Database does not exist: %s" % config['database'])
            else:
                print(err)
            exit()

    def main(self):
        (options, args) = self.parser.parse_args()

        if options.stdin:
            if options.workload:
                tmp = json.loads(sys.stdin.read())
                self.__gantt2workload(tmp)
            elif options.gantt:
                self.data = json.loads(sys.stdin.read())
        elif options.csv:
            with open(options.csv) as csvfile:
                items = csv.DictReader(csvfile)

                if options.workload:
                    tmp = {}
                    beginDate = datetime.now().date()
                    endDate = datetime.now().date()
                    for item in items:

                        start = datetime.strptime(
                            item['start'], '%Y-%m-%d').date()
                        finish = datetime.strptime(
                            item['finish'], '%Y-%m-%d').date()
                        if not item['resource']:
                            continue
                            # item['resource'] = 'Null'
                        if item['resource'] and item['resource'] in tmp.keys():
                            if tmp[item['resource']]['start'] > start:
                                tmp[item['resource']]['start'] = start
                            if tmp[item['resource']]['finish'] < finish:
                                tmp[item['resource']]['finish'] = finish
                        else:
                            tmp[item['resource']] = {
                                'resource': item['resource'], 'start': start, 'finish': finish}
                        # print(item['resource'])
                    # data = json.loads(tmp)
                    self.data = tmp
                    # print(tmp)
                elif options.gantt:
                    tmp = Data()
                    for item in items:
                        if item['milestone'] == 'TRUE':
                            item['milestone'] = True
                        else:
                            item['milestone'] = False

                        tmp.add(item['id'], item['name'], item['start'],
                                item['finish'], item['resource'], item['predecessor'], item['milestone'], item['parent'])
                    # print(tmp.data)
                    self.data = tmp.data
        elif options.host:
            config = {
                'host': options.host,
                'user': options.username,
                'password': options.password,
                'database': options.database,
                'raise_on_warnings': True
            }
            self.loadFromMySQL(config)
        if options.debug:
            print(options, args)
            print(json.dumps(self.data, ensure_ascii=False))

        if not self.data:
            # else:
            self.usage()

        self.gantt.load(self.data)

        self.gantt.setWorkweeks(6, True)
        if options.workload:
            self.gantt.workloadChart(options.title)
        elif options.gantt:
            self.gantt.ganttChart(options.title)
        if options.save:
            self.gantt.save(options.save)
        else:
            if options.workload:
                file = 'workload.svg'
            elif options.gantt:
                file = 'gantt.svg'
            self.gantt.save(file)
            # self.gantt.export(file)


if __name__ == '__main__':
    ganttChart = GanttChart()
    ganttChart.main()
