import os
import json
import falcon
import jinja2
import urllib.request

from icalendar import Calendar, Event
from datetime import datetime, timedelta
from pytz import UTC
from functools import cmp_to_key
from falcon_multipart.middleware import MultipartMiddleware

import services

# CORS middleware
class CorsMiddleware:
    def process_request(self, req, resp):
        resp.set_header('Access-Control-Allow-Origin', '*')
        resp.set_header('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type, Origin, Accept, Accept-Encoding, Access-Control-Request-Method, Authorization')
        resp.set_header('Access-Control-Allow-Methods', 'PUT, POST, GET, OPTIONS, PATCH, DELETE')

app = application = falcon.API(middleware=[CorsMiddleware()])

app.req_options.auto_parse_form_urlencoded = True

ics_file = 'https://trello.com/calendar/5c46ec1decc0d04401b52cbd/5c4eb42bd47fc873fb96fffe/c66cc2f4f649ba14916b03d0c53652c9.ics'

def load_template(name):
    path = os.path.join('templates', name)
    with open(os.path.abspath(path), 'r') as fp:
        return jinja2.Template(fp.read())

class TestResources:
    def on_get(self, req, resp):
        resp.content_type = 'text/html'
        
        url = urllib.request.urlopen(ics_file)
        gcal = Calendar.from_ical(url.read())

        data = []
        for component in gcal.walk():
            if component.name == "VEVENT":
                start = component.get('dtstart').dt + timedelta(hours=7)
                if start.hour >= 18:
                    start = start - timedelta(hours=12)
                dtstart = start.strftime("%d-%m-%Y %H:%M:%S")

                dtstamp = (component.get('dtstamp').dt + timedelta(hours=7)).strftime("%d-%m-%Y %H:%M:%S")

                if component.get('dtend') is not None:
                    dtend = (component.get('dtend').dt + timedelta(hours=7)).strftime("%d-%m-%Y %H:%M:%S")
                else:
                    dtend = 'No Object'

                tmp = {
                    'uid': str(component.get('uid')),
                    'summary': str(component.get('summary')),
                    # 'dtstart': str(component.get('dtstart').__dict__),
                    # 'dtend': str(component.get('dtend').__dict__) if component.get('dtend') is not None else 'No Object',
                    # 'dtstamp': str(component.get('dtstamp').__dict__)
                    # 'dtstart': component.get('dtstart').dt.timedelta(hours=7).strftime("%d-%m-%Y %H:%M:%S"),
                    # 'dtend': component.get('dtend').dt.timedelta(hours=7).strftime("%d-%m-%Y %H:%M:%S") if component.get('dtend') is not None else 'No Object',
                    # 'dtstamp': component.get('dtstamp').dt.strftime("%d-%m-%Y %H:%M:%S")
                    'dtstart': dtstart,
                    'dtend': dtend,
                    'dtstamp': dtstamp
                }

                # tmp = {
                #     'uid': str(component.get('uid')),
                #     'summary': str(component.get('summary')),
                #     'dtstart': component.get('dtstart').dt,
                #     'dtend': component.get('dtend').dt if component.get('dtend') is not None else None,
                #     'dtstamp': component.get('dtstamp').dt
                # }

                data.append(tmp)

        # result = []
        # for d in data:
        #     start = component.get('dtstart').dt + timedelta(hours=7)
        #     if start.hour >= 18:
        #         start = start - timedelta(hours=12)
        #     dtstart = start.strftime("%d-%m-%Y %H:%M:%S")

        #     dtstamp = (component.get('dtstamp').dt + timedelta(hours=7)).strftime("%d-%m-%Y %H:%M:%S")

        #     if component.get('dtend') is not None:
        #         dtend = (component.get('dtend').dt + timedelta(hours=7)).strftime("%d-%m-%Y %H:%M:%S")
        #     else:
        #         dtend = 'No Object'

        #     tmp = {
        #         'uid': d.uid
        #         'dtstart': dtstart,
        #         'dtend': dtend,
        #         'dtstamp': dtstamp
        #     }
        
        # resp.body = ''
        # for component in gcal.walk():
        #     if component.name == "VEVENT":
        #         resp.body += '<ul>'
        #         resp.body += ('<li>' + str(component.get('uid')) + '</li>')
        #         resp.body += ('<li>' + str(component.get('summary')) + '</li>')
        #         resp.body += ('<li>' + str(component.get('dtstart').__dict__) + '</li>')
                
        #         if component.get('dtend') is not None:
        #             resp.body += ('<li>' + str(component.get('dtend').__dict__) + '</li>')
        #         else:
        #             resp.body += ('<li>No Object</li>')
                    
        #         resp.body += ('<li>' + str(component.get('dtstamp').__dict__) + '</li>')
        #         resp.body += '</ul>'
        
        url.close()

        template = load_template('test.html')
        resp.body = template.render(data=data)

class TestInputResources:
    def on_post(self, req, resp):
        uid = req.get_param('uid')
        data = {
            'region' : req.get_param('region'),
            'pic' : req.get_param('pic'),
            'bd' : req.get_param('bd'),
            'attendee' : req.get_param('attendee'),
            'location' : req.get_param('location'),
            'description' : req.get_param('description')
        }

        services.save_schedule_additional_data(uid, data)
        
        resp.content_type = 'text/plain'
        resp.body = json.dumps(data)

class ScheduleResources:
    def on_get(self, req, resp, old=None):
        if old is not None and old == 'old':
            data = services.get_all_schedules(True)
        else:
            data = services.get_all_schedules()

        # print(str(old))
        resp.body = json.dumps(data)

    def on_post(self, req, resp, old=None):
        params = json.loads(req.bounded_stream.read().decode('utf-8'))
        
        uid = params['uid']
        data = {
            'solution' : params['solution'], 
            'region' : params['region'],
            'pic' : params['pic'],
            'bd' : params['bd'],
            'attendee' : params['attendee'],
            'location' : params['location'],
            'description' : params['description']
        }

        services.save_schedule_additional_data(uid, data)

        resp.body = json.dumps({'status':1,'message':'Success'})

#Route
app.add_route('/test', TestResources())
app.add_route('/test-input', TestInputResources())
app.add_route('/schedule', ScheduleResources())
app.add_route('/schedule/{old}', ScheduleResources())
