import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
from matplotlib import colormaps
import numpy as np
import pandas as pd
from mpl_ornaments.titles import set_title_and_subtitle

fig, ax = plt.subplots(nrows=1, ncols=1)

df = pd.read_csv('data/product-design.csv', comment='#')
df['Duration'] = df['End'] - df['Start']
df.sort_values(by='Start', inplace=True, ascending=True)

#1
cpalette = colormaps['Set2'].colors[0:df['Phase'].nunique()]

#2
major_ticks, minor_ticks, major_labels, minor_labels =\
    (list() for i in range(4))
ticks_counter = 0

#3
for phase_idx, (phase_name, phase) in enumerate(df.groupby(by='Phase')):
    
#4
    phase_start = phase['Start'].min()
    phase_duration = phase['End'].max() - phase_start

#5
    major_labels.append(phase_name)
    major_ticks.append(ticks_counter)

#6
    ax.barh(y=ticks_counter, left=phase_start, width=phase_duration, 
            color='gray', edgecolor='k', height=0.5)
    ticks_counter = ticks_counter + 1 
    
#7
    for activity_name, activity in phase.groupby(by='Activity', 
                                                 sort=False):
        
#8
        activity_start = activity['Start'].min()
        activity_duration = activity['End'].max() - activity_start
        
#9
        minor_labels.append(activity_name)
        minor_ticks.append(ticks_counter)

#10
        ax.barh(y=ticks_counter, left=activity_start, 
                width=activity_duration, color=cpalette[phase_idx], 
                edgecolor='k', height=0.5)
        ticks_counter = ticks_counter + 1
        
#11
ax.yaxis.set_major_locator(ticker.FixedLocator(major_ticks))
ax.yaxis.set_minor_locator(ticker.FixedLocator(minor_ticks))

#12
ax.set_yticklabels(labels=major_labels, minor=False, fontweight="bold")
ax.set_yticklabels(labels=minor_labels, minor=True)

#13
ax.invert_yaxis()

#14
start, end = (df['Start'].min(), df['End'].max())
ax.set_xlim(left=start, right=end)

#15
ax.set_xticks(ticks=range(start, end+1), minor=True)

#16
ax.grid(visible=True, which='major', axis='x', linewidth=1)
ax.grid(visible=True, which='minor', axis='x', linewidth=0.5)

#17
ax.grid(visible=True, which='major', axis='y', linewidth=1)
 
title = 'Product design Gantt chart'
subtitle = 'Activities and phases'
set_title_and_subtitle(title=title, subtitle=subtitle, fig=fig, 
                       alignment='left', h_offset=-30)

ax.set_xlabel('Months after go ahead', fontsize=14)

fig.savefig('charts/gantt-with-phases.png', bbox_inches='tight',
            dpi=600)