# -*- coding: utf-8 -*-
# vi:si:et:sw=4:sts=4:ts=4
from __future__ import division

from ox.utils import json
from ox.django.decorators import login_required_json
from ox.django.shortcuts import render_to_json_response, get_object_or_404_json, json_response

import models
from api.actions import actions


@login_required_json
def addEvent(request):
    '''
        param data
            {
                'name': '',
                'start': ''
                'end': ''
            }
            required keys: name, start, end
    '''
    data = json.loads(request.POST['data'])
    #FIXME: check for alternativeNames too!
    if models.Event.filter(name=data['name']).count() == 0:
        event = models.Event(name = data['name'])
        for key in ('start', 'end', 'alternativeNames'):
            if key in data and data[key]:
                setattr(event, key, data[key])
        event.save()
        response = json_response(status=200, text='created')
    else:
        response = json_response(status=403, text='event name exists')
    return render_to_json_response(response)
actions.register(addEvent, cache=False)


@login_required_json
def editEvent(request):
    '''
        param data
            {
                'id': event id,
                'name': ''
                ...
            }
            update provides keys of event with id
    '''
    data = json.loads(request.POST['data'])
    event = get_object_or_404_json(models.Event, pk=data['id'])
    if event.editable(request.user):
        conflict = False
        names = [data.get('name', event.name)] + data.get('alternativeNames', [])
        for name in names: #FIXME: also check aliases!
            if models.Event.filter(name=data['name']).exclude(id=event.id).count() != 0:
                conflict = True
        if not conflict:
            for key in ('start', 'end', 'alternativeNames'):
                if key in data:
                    setattr(event, key, data[key])
            event.save()
            response = json_response(status=200, text='updated')
        else:
            response = json_response(status=403, text='Event name conflict')
    else:
        response = json_response(status=403, text='permission denied')
    return render_to_json_response(response)
actions.register(editEvent, cache=False)


@login_required_json
def removeEvent(request):
    '''
        param data {
            id: event id
        }
        remove Event with given id

    '''
    data = json.loads(request.POST['data'])
    event = get_object_or_404_json(models.Event, pk=data['id'])
    if event.editable(request.user):
        event.delete()
        response = json_response(status=200, text='removed')
    else:
        response = json_response(status=403, text='permission denied')
    return render_to_json_response(response)
actions.register(removeEvent, cache=False)


def findEvents(request):
    '''
        param data
            {'query': query, 'sort': array, 'range': array}

            query: query object, more on query syntax at
                   https://wiki.0x2620.org/wiki/pandora/QuerySyntax
            itemQuery: {
                //see find request
            },
            sort: array of key, operator dics
                [
                    {
                        key: "year",
                        operator: "-"
                    },
                    {
                        key: "director",
                        operator: ""
                    }
                ]
            range:       result range, array [from, to]

        itemQuery can be used to limit the resuts to matches in those items.
        
        with keys, items is list of dicts with requested properties:
          return {'status': {'code': int, 'text': string},
                'data': {items: array}}

Positions
        param data
            {'query': query, 'ids': []}

            query: query object, more on query syntax at
                   https://wiki.0x2620.org/wiki/pandora/QuerySyntax
            ids:  ids of events for which positions are required
    '''
    data = json.loads(request.POST['data'])
    response = json_response(status=200, text='ok')
    response['data']['events'] = []
    #FIXME: add coordinates to limit search
    for p in models.Event.objects.find(data['query']):
        response['data']['events'].append(p.json())
    return render_to_json_response(response)
actions.register(findEvents)