#!/usr/bin/env python3

# Program to create a photo checklist of a given frc event.

import configparser
import datetime as dt
import re
import operator
import os
import sys
import tbapy
import todoist

# getProjectID() returns the project id that matches the name given.
def getProjectID(api, name):
    for project in api.state['projects']:
        if project['name'] == name:
            return project['id']
    print('Error: No project with the name {} found'.format(name))
    exit(1)

# getChecklistName()
def getChecklistName(evemt):
    return '{} Photos'.format(event['name'])

# getEventListID() returns the id of the checklist for the event and if there is none
# returns -1.
def getEventListID(items, event):
    for item in items:
        if item['content'] == getChecklistName(event):
            return item['id']
    return -1

# matchToTeamList() converts a match to two lists of teams
def matchToTeamList(match):
    return match['alliances']['red']['team_keys'], match['alliances']['blue']['team_keys']

# createChecklistItem() creates a checklist item of the highest priority.
def createChecklistItem(name, api, projectID, item, date):
    return api.items.add(name,
                         project_id=projectID,
                         parent_id=item['id'],
                         date_string=date,
                         priority=4)

# createPhotoChecklistItem() creates a checklist item that requires a photo.
def createPhotoChecklistItem(name, api, projectID, item, date):
    return createChecklistItem('Take photo of **{}**'.format(name),
                               api, projectID, item, date)

# createPitList() creates a checklist for taking photos of a teams pit.
def createPitList(api, teams, projectID, checklist, date):
    item = api.items.add('**Take** Pit Photos',
                         project_id=projectID,
                         parent_id=checklist['id'],
                         date_string=date,
                         priority=3)
    for team in teams:
        createChecklistItem('Pit photo of **{}** {}'.format(team['team_number'], team['nickname']),
                            api, projectID, item, date)
        
# createGroupsList() creates a checklist of the different groups of volenteers.
def createGroupsList(api, projectID, checklist, date):
    item = api.items.add('Groups',
                         project_id=projectID,
                         parent_id=checklist['id'],
                         date_string=date,
                         priority=3)
    groups = ['Judges', 'Robot Inspectors', 'Referees', 'Safety Inspectors',
              'Field Reset', 'Queuers', 'CSAs', 'VC and Pit Admin']
    for group in groups:
        createPhotoChecklistItem(group, api, projectID, item, date)

# createWinnersList() creates a checklist of the winners of an event.
def createWinnersList(api, projectID, checklist, date):
    item = api.items.add('Winners',
                         project_id=projectID,
                         parent_id=checklist['id'],
                         date_string=date,
                         priority=3)
    groups = ['Chairman\'s award', 'Engineering Inspiration', 'Rookie All-Star', 'Winning Alliance',
              'Winning Team 1', 'Winning Team 2', 'Winning Team 3']
    for group in groups:
        createPhotoChecklistItem(group, api, projectID, item, date)

# createRobotList() creates a checklist for taking photos of a team's robot.
def createRobotList(api, teams, projectID, checklist, date):
    item = api.items.add('**Take** Robot Photos',
                         project_id=projectID,
                         parent_id=checklist['id'],
                         date_string=date,
                         priority=3)
    for team in teams:
        createChecklistItem('Robot photo of **{}** {}'.format(team['team_number'], team['nickname']),
                            api, projectID, item, date)
        
# Parse settings config
configString = '[Settings]\n' + open('../settings.conf').read()
configParser = configparser.RawConfigParser()
configParser.read_string(configString)

# Load needed credentials
tbaKey = configParser.get('Settings', 'TBAKey')
todoistToken = configParser.get('Settings', 'TodoistToken')

# Setup Todoist
api = todoist.TodoistAPI(todoistToken)
api.sync()
projectID = getProjectID(api, '🤖 Robotics')
items = api.state['items']

# Setup the Blue Alliance
tba = tbapy.TBA(tbaKey)
eventKey = sys.argv[1]
event = tba.event(eventKey)
setupDay = event['start_date']
day1 = (dt.datetime.strptime(setupDay, '%Y-%m-%d') + dt.timedelta(days=1)).strftime('%Y-%m-%d')
day2 = event['end_date']
teams = sorted(tba.event_teams(eventKey), key=operator.attrgetter('team_number'))

def firstMatch(team, matches):
    for match in matches:
        red, blue = matchToTeamList(match)
        if team in red:
            return match, 'red'
        elif team in blue:
            return match, 'blue'
    return None, None

# Check if list already exists
eventListID = getEventListID(items, event)
if eventListID == -1:
    # Create checklist
    checklist = api.items.add(getChecklistName(event),
                              project_id=projectID,
                              date_string=day2,
                              priority=2)
    # Setup
    createPitList(api, teams, projectID, checklist, setupDay)
    createChecklistItem('**Schedule** Judges photo', api, projectID, checklist, setupDay)
    createChecklistItem('**Schedule** Inspectors photo', api, projectID, checklist, setupDay)
    createChecklistItem('**Schedule** Seniors photo', api, projectID, checklist, setupDay)
    createGroupsList(api, projectID, checklist, setupDay)
    # Day 1
    createPhotoChecklistItem('Guest Speakers', api, projectID, checklist, day1)
    createRobotList(api, teams, projectID, checklist, day1)
    # Day 2
    createPhotoChecklistItem('Guest Speakers', api, projectID, checklist, day2)
    createPhotoChecklistItem('Mentors after parade', api, projectID, checklist, day2)
    createPhotoChecklistItem('Seniors', api, projectID, checklist, day2)
    createPhotoChecklistItem('Alliances Representatives', api, projectID, checklist, day2)
    createWinnersList(api, projectID, checklist, day2)
    createChecklistItem('**Email** guest speakers and winners photos', api, projectID, checklist, day2)
else:
    print('List already created')
    matches = sorted(tba.event_matches(eventKey), key=operator.attrgetter('time'))
    if not matches:
        print('No match schedule yet')
    else:
        photoParentID = [item['id'] for item in items if 'parent_id' in item
                         and item['parent_id'] == eventListID
                         and 'Robot Photos' in item['content']][0]
        robotPhotoList = [item for item in items if 'Robot photo of' in item['content']
                          and item['parent_id'] == photoParentID]
        for robot in robotPhotoList:
            if 'match' not in robot['content']:
                team = 'frc{}'.format(re.findall(r'\d+', robot['content'])[0])
                match, side = firstMatch(team, matches)
                if match != None:
                    matchNumber = match['match_number']
                    matchTime = dt.datetime.fromtimestamp(match['time']).strftime('%Y-%m-%d %I:%M %p')
                    robot.update(date_string=matchTime, content='{} match {} {}'.format(robot['content'], matchNumber, side))
api.commit()