# coding: utf-8
'''
Created on 23.10.2014

@author: m.prudyvus
'''

import json
from java.util import ArrayList
# from org.activiti.engine.delegate.event import BaseEntityEventListener
try:
    from ru.curs.showcase.core.jython import JythonDTO
    from ru.curs.showcase.core.selector import ResultSelectorData
    from ru.beta2.extra.gwt.ui.selector.api import DataRecord
except:
    from ru.curs.celesta.showcase import JythonDTO, DataRecord, ResultSelectorData

from workflow.processUtils import ActivitiObject
from ru.curs.celesta.showcase.utils import XMLJSONConverter
from workflow._workflow_orm import statusCursor, statusTransitionCursor

def cardData(context, main=None, add=None, filterinfo=None, session=None, elementId=None):
    u'''карточка стандартного завершения задачи со сменой статуса'''
    activiti = ActivitiObject()
    taskService = activiti.taskService
    session = json.loads(session)['sessioncontext']

    if isinstance(session['urlparams']['urlparam'], list):
        for params in session['urlparams']['urlparam']:
            if params['@name'] == 'taskId':
                taskId = params['@value'][0]
    xformsdata = {"schema":
                    {"data":{"@newStatus": "",
                             "@comment": "",
                             "statuses": {"status": []}}
                     }
                  }
    if add != "added":
        currentStatus = taskService.getVariable(taskId, 'status')
        model = taskService.getVariable(taskId, 'statusModel')
        status = statusCursor(context)
        statusTransition = statusTransitionCursor(context)
        statusTransition.setRange('statusFrom', currentStatus)
        statusTransition.setRange('modelFrom', model)
        xformsdata['schema']['data']['@type'] = 'add'
        for statusTransition in statusTransition.iterate():
            status.get(statusTransition.statusTo, statusTransition.modelTo)
            xformsdata["schema"]["data"]["statuses"]["status"].append({"@name": statusTransition.name,
                                                                       "@id": status.id})
    else:
        xformsdata['schema']['data']['@type'] = 'hide'


    xformssettings = {"properties":
                      {"event":
                       [{"@name": "single_click",
                         "@linkId": "1",
                         "action":
                            {"#sorted":[{"main_context": "current"},
                                         {"datapanel":
                                            {"@type": "current",
                                             "@tab": "current",
                                             "element":
                                                {"@id":'completeTaskCard',
                                                 "add_context":"added"}}}]}}]}}
    return JythonDTO(XMLJSONConverter.jsonToXml(json.dumps(xformsdata)),
                     XMLJSONConverter.jsonToXml(json.dumps(xformssettings)))

def cardDataSave(context, main=None, add=None, filterinfo=None, session=None, elementId=None, xformsdata=None):
    u'''процедура стандартного завершения задачи со сменой статуса'''
    session = json.loads(session)['sessioncontext']
    sid = session['sid']
    if isinstance(session['urlparams']['urlparam'], list):
        for params in session['urlparams']['urlparam']:
            if params['@name'] == 'taskId':
                taskId = params['@value'][0]
            elif params['@name'] == 'processId':
                processId = params['@value'][0]
    activiti = ActivitiObject()
    jsonData = json.loads(xformsdata)["schema"]["data"]

    if jsonData["@newStatus"] != '':
        if ' '.join(jsonData["@comment"].split(' ')) != '':
            activiti.addCommentWithUserId(context,taskId, processId, jsonData["@comment"],sid)
        activiti.taskService.complete(taskId, {"status": jsonData["@newStatus"]})
        return context.message(u'Задача выполнена, статус изменен')
    else:
        return context.error(u'Ошибка, не выбран новый статус')