#!/usr/bin/python
# -*- encoding: utf-8 -*-

import sys
import re
import datetime
import traceback

from pyintrack import util

from app.asael.shortcuts import return_template, return_json, render_to_string
from app.usuarios.funcoes import get_usuario

import models


def tasks(r):

    usuario = get_usuario(r.user)
    workspaces = models.Workspace.objects.filter(usuario=usuario)

    atalhos = (
        (u'by:%s' % usuario.usuario.username, u'Tarefas que eu criei'),
        (u'#%s' % usuario.usuario.username, u'Tarefas associadas a mim'),
        (u'concluídas', u'Tarefas concluídas'),
    )

    return return_template(r, "tasktracker-tasks.html", {
        'page_title': u'Task Tracker',
        'page_subtitle': u'Tarefas',
        'workspaces': workspaces,
        'atalhos': atalhos,
    })


def _all_tasks(r):
    tarefas = models.Tarefa.objects.filter(
        data_conclusao__isnull=True).order_by('-id')
    return tarefas


def list_tasks(r):

    usuario = get_usuario(r.user)

    if 'tags[]' in r.POST:
        tags = [re.sub('^\#', '', x) for x in r.POST.getlist('tags[]') if x]
    else:
        tags = None

    # Valor default:
    ver_concluidas = False

    # Pega as tarefas:
    if not tags:
        tarefas = _all_tasks(r)
        tag_objects = []
    else:
        taglist = [models.normalizar(tag) for tag in tags]

        tarefas = models.Tarefa.objects.all()

        if tags and u'concluídas' in taglist:
            ver_concluidas = True
            taglist.remove(u'concluídas')

        # Subcomandos:
        # by:cleber.zavadniak
        for tagname in taglist:
            ocorrencias = re.findall('by:[^ ]+', tagname)
            if ocorrencias:
                taglist.remove(tagname)
                for oc in ocorrencias:
                    username = oc.split(':')[-1]
                    tarefas = tarefas.filter(autor__usuario__username=username)

        tag_objects = models.TagTarefa.objects.filter(nome__in=taglist)

        if taglist:
            tarefas = tarefas.filter(
                tagtarefa_tarefa__tagtarefa__in=tag_objects)

    # Tem alguma tarefa em execução?
    tw = models.TimeWorked.objects.filter(
        usuario=usuario,
        data_fim__isnull=True)
    if tw.count():
        em_execucao = tw[0].tarefa
    else:
        em_execucao = None

    # Contabiliza o tempo das tarefas abertas:
    t_abertas = 0
    for tarefa in tarefas.filter(data_conclusao__isnull=True):
        t_abertas += tarefa.tempo_total()
    t_abertas_fmt = util.seconds2hhmmss(t_abertas)

    # Contabiliza o tempo das tarefas concluídas:
    t_concluidas = 0
    for tarefa in tarefas.filter(data_conclusao__isnull=False):
        t_concluidas += tarefa.tempo_total()

    t_concluidas_fmt = util.seconds2hhmmss(t_concluidas)

    if ver_concluidas:
        tarefas = tarefas.filter(data_conclusao__isnull=False)
    else:
        tarefas = tarefas.filter(data_conclusao__isnull=True)

    html = render_to_string(r, "tasktracker-lista.html", {
        'tarefas': tarefas[0:250],
        'tags': tag_objects,
        'em_execucao': em_execucao,
        't_concluidas': t_concluidas,
        't_abertas': t_abertas,
        't_concluidas_fmt': t_concluidas_fmt,
        't_abertas_fmt': t_abertas_fmt,
    })

    return return_json(r, {
        'status': 0,
        'html': html,
    })


def save_task(r):

    # Alguns "subcomandos":
    # id:X trata-se de uma edição!

    usuario = get_usuario(r.user)

    if not usuario:
        return return_json(r, {
            'status': -2,
            'msg': u"Você precisa estar logado!"
        })

    termo = r.POST['termo'].encode('utf-8')
    termo = termo.strip(' ').strip('\n')

    # Some com as aspas, que enxem o saco na hora de jogar no HTML:
    termo = termo.replace('"', '&quot;').replace("'", '&#39;')

    # Procura subcomandos:
    ocorrencias = re.findall('id:\d+', termo)
    if ocorrencias:
        for oc in ocorrencias:
            termo = termo.replace(oc, '').strip(' ')

            idtask = int(oc.split(':')[-1])

        tarefa = models.Tarefa.objects.get(id=idtask)

        if tarefa.autor != usuario:
            return return_json(r, {
                'status': 1,
                'msg': u"Você não é dono desta tarefa."
            })
        else:
            tarefa.descricao = termo

    else:
        idtask = None

        # Tem uma tarefa igualzinha???
        if models.Tarefa.objects.filter(descricao=termo).exists():
            return return_json(r, {
                'status': 1,
                'msg': u'Essa tarefa já existe!'
            })

        tarefa = models.Tarefa(descricao=termo, autor=usuario)

    # Tenta salvar:
    try:
        tarefa.save()
    except Exception as e:
        traceback.print_exc(file=sys.stderr)
        return return_json(r, {
            'status': 2,
            'msg': u'%s' % e
        })

    return return_json(r, {
        'status': 0,
    })


def concluir_task(r, idtask):
    usuario = get_usuario(r.user)

    if not usuario:
        return return_json(r, {
            'status': -2,
            'msg': u"Você precisa estar logado!"
        })

    tarefa = models.Tarefa.objects.get(id=idtask)

    usertag = (u'#%s' % usuario.usuario.username).encode('utf-8')
    if (tarefa.autor != usuario) and (usertag not in tarefa.descricao):
        return return_json(r, {
            'status': 1,
            'msg': u"Você não é dono desta tarefa."
        })

    # Para a tarefa antes de botar como concluída:
    query = models.TimeWorked.objects.filter(
        usuario=usuario,
        tarefa=tarefa,
        data_fim__isnull=True)
    if query.exists():
        agora = datetime.datetime.now()
        for tw in query.all():
            tw.data_fim = agora
            tw.save()

    tarefa.data_conclusao = datetime.datetime.now()
    tarefa.save()

    return return_json(r, {
        'status': 0,
    })


def delete_task(r, idtask):
    usuario = get_usuario(r.user)

    if not usuario:
        return return_json(r, {
            'status': -2,
            'msg': u"Você precisa estar logado!"
        })

    tarefa = models.Tarefa.objects.get(id=idtask)

    if tarefa.autor != usuario:
        return return_json(r, {
            'status': 1,
            'msg': u"Você não é dono desta tarefa."
        })

    tarefa.delete()
    return return_json(r, {
        'status': 0,
    })


def start(r, idtask):

    usuario = get_usuario(r.user, r)
    tarefa = models.Tarefa.objects.get(id=idtask)
    agora = datetime.datetime.now()

    # Para as outras tarefas:
    for t in models.TimeWorked.objects.filter(
            usuario=usuario,
            data_fim__isnull=True):
        t.data_fim = agora
        t.save()

    # Começa uma nova:
    t = models.TimeWorked()
    t.tarefa = tarefa
    t.usuario = usuario
    t.natural = True    # Não foi criado manualmente!
    t.save()

    #
    return return_json(r, {
        'status': 0,
    })


def stop(r, idtask=None):
    # Parar a execução da tarefa

    usuario = get_usuario(r.user, r)
    if not usuario:
        return return_json(r, {
            'status': -1,
            'msg': u'Você precisa estar logado.'
        })

    agora = datetime.datetime.now()

    for t in models.TimeWorked.objects.filter(
            usuario=usuario,
            data_fim__isnull=True):

        diff = agora - t.data_inicio

        if diff.seconds > 15:
            t.data_fim = agora
            t.save()
        else:
            t.delete()

    return return_json(r, {
        'status': 0,
    })


def adicionar_tempo(r, idtask):

    if 'tempo' in r.POST:

        try:
            tempo = int(r.POST['tempo'])
        except Exception as e:
            return return_json(r, {
                'status': 1,
                'msg': u'Houve algum erro ao tentar salvar esse tempo: %s' % e,
            })
        else:
            usuario = get_usuario(r.user, r)
            tarefa = models.Tarefa.objects.get(id=idtask)

            # Cria um TimeWorked artificial com o tempo especificado:
            fim = datetime.datetime.now() + datetime.timedelta(minutes=tempo)

            tw = models.TimeWorked()
            tw.usuario = usuario
            tw.tarefa = tarefa
            tw.data_fim = fim
            tw.natural = False
            tw.save()

        return return_json(r, {
            'status': 0,
            'msg': u'Tempo adicionado com sucesso.',
        })

    else:
        return return_json(r, {
            'status': 0,
            'msg': u'Você precisa indicar um tempo válido em minutos.',
        })


# -----------
def salvar_workspace(r):
    termo = models.normalizar(r.POST['termo'])

    usuario = get_usuario(r.user)

    w = models.Workspace(
        usuario=usuario,
        termo=termo.encode('utf-8')
    )
    w.save()

    return return_json(r, {
        'status': 0,
    })


def excluir_workspace(r, idworkspace):
    usuario = get_usuario(r.user)

    w = models.Workspace.objects.get(id=idworkspace)
    if w.usuario == usuario:
        w.delete()

        return return_json(r, {
            'status': 0,
        })
    else:
        return return_json(r, {
            'status': 1,
            'msg': u'Você não é dono deste workspace',
        })
