#! /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
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')
        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 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
        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.title(options.title)
        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()
