#! /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.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="/path/to/gantt.csv")
        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='gantt.svg', 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()

    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.gantt:
                    tmp = Data()
                    for item in items:
                        tmp.add(item['id'], item['name'], item['start'],
                                item['finish'], item['resource'], item['next'], item['milestone'], item['parent'])
                    self.data = tmp.data

                elif 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']:
                            item['resource'] = 'Null'
                        if 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)

        if options.debug:
            print(options, args)
            data = [
                {'name': '汉字', 'start': '2023-03-01',
                 'finish': '2023-04-05', 'progress': 3},
                {'name': 'Java', 'start': '2023-03-01',
                 'finish': '2023-03-05', 'progress': 2},
                {'name': 'PHP', 'start': '2023-03-03',
                 'finish': '2023-03-10', 'progress': 5},
                {'name': 'Go', 'start': '2023-03-10', 'finish': '2023-03-20'},
                {'name': 'Python', 'start': '2023-03-06', 'finish': '2023-03-08'},
                {'name': 'Swift', 'start': '2023-03-06', 'finish': '2023-03-20', 'subitem': [
                    {'name': 'LLVM', 'start': '2023-03-09', 'finish': '2023-03-14'},
                    {'name': 'Clang', 'start': '2023-03-03', 'finish': '2023-03-10'},
                ]},
            ]
            print(json.dumps(data, ensure_ascii=False))
        if options.save:
            self.gantt.save(options.save)
        if not self.data:
            # else:
            self.usage()

        self.gantt.load(self.data)
        self.gantt.title(options.title)

        if options.workload:
            self.gantt.workloadChart()
        elif options.gantt:
            self.gantt.ganttChart()
        if options.save:
            self.gantt.save(options.save)


ganttChart = GanttChart()
ganttChart.main()
