#! /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:
    def __init__(self) -> None:

        self.parser = OptionParser("usage: %prog [options] message")
        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=False, 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 main(self):
        (options, args) = self.parser.parse_args()
        if options.stdin:
            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['parent'])
                        # print(item)
                    # 
                    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)
                    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-01', 'finish': '2023-03-05'},
                    {'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)
        # else:
            # self.usage()

        self.gantt.load(data)
        self.gantt.title("Gantt Test")
        if options.gantt:
            self.gantt.ganttChart()
        elif options.workload:
            self.gantt.workloadChart()
        self.gantt.save('gantt.svg')


ganttChart = GanttChart()
ganttChart.main()
