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

@author: Victor B.
'''
import json
from ru.curs.celesta.showcase.utils import XMLJSONConverter
from common.sysfunctions import toHexForXml, getGridHeight
from qt._qt_orm import QtiDestructorCursor, QtiQuestionCursor
try:
    from ru.curs.showcase.core.jython import JythonDTO
    from ru.curs.showcase.app.api import MessageType, UserMessage
except:
    from ru.curs.celesta.showcase import JythonDTO


def gridData(context, main, add=None, filterinfo=None, session=None,
               elementId=None, sortColumnList=None, firstrecord=None, pagesize=None):    
    #Данные сессии
    session = json.loads(session)    
    #Создание курсоров для таблиц QtiDestructor и QtiQuestion
    qti_d = QtiDestructorCursor(context)
    QtiQuestion = QtiQuestionCursor(context)    
    #Получение идентификатора вопроса
    questionId = session['sessioncontext']['related']['gridContext']['currentRecordId']
    #Получение вопроса по его идентификатору
    QtiQuestion.get(questionId)
    #Тип вопроса
    questionType = QtiQuestion.QuestionType
    #Фильтрация вопросов по id выбранного вопроса
    if 'gridContext' in session['sessioncontext']['related']:
        if 'currentRecordId' in session['sessioncontext']['related']['gridContext']:
            qti_d.setRange('QuestionID', questionId)
    else:
        qti_d.setRange('QuestionID', None)
        
    qti_d.orderBy('DestructorOrder')

    data = {"records":{"rec":[]}}
    
    propertiesDict = {"event": {
                        "@name":"row_single_click",
                        "action": {
                            "#sorted": [
                                {"main_context":"current"},
                                {"datapanel":  {
                                    "@type":"current",
                                    "@tab":"current"}}]}}}    
    #Тип вопроса - одиночный выбор либо множественный выбор
    for rec in qti_d.iterate():
        currentrow = {}
        currentrow[toHexForXml("~~id")] = rec.DestructorID
        currentrow[toHexForXml(u"HTML ответа")] = rec.DestructorHtml.replace('&nbsp;', ' ')
        
        if questionType in (1,2,7):
            currentrow[toHexForXml(u"Правильно")] = 'v' if rec.IsTrue else ''
        elif questionType == 3:
            pass        
        elif questionType == 4 or questionType == 6:
            currentrow[toHexForXml(u"HTML соответствия")] = rec.AnswerText.replace('&nbsp;', ' ')        
        elif questionType == 5:  
            currentrow[toHexForXml(u"Порядок ответа")] = rec.DestructorOrder
              
        currentrow["properties"] = propertiesDict
        data['records']['rec'].append(currentrow)

    return JythonDTO(XMLJSONConverter.jsonToXml(json.dumps(data)), None)


def gridMeta(context, main=None, add=None, filterinfo=None, session=None, elementId=None, sortColumnList=None):    
    qti_d = QtiDestructorCursor(context)
    QtiQuestion = QtiQuestionCursor(context)
    session = json.loads(session)    
    #Получение идентификатора вопроса
    questionId = session['sessioncontext']['related']['gridContext']['currentRecordId']
    #Получение вопроса по его идентификатору
    QtiQuestion.get(questionId)
    #Тип вопроса
    questionType = QtiQuestion.QuestionType    
    #применяем внешний фильтр
    if 'gridContext' in session['sessioncontext']['related']:
        if 'currentRecordId' in session['sessioncontext']['related']['gridContext']:
            qti_d.setRange('QuestionID', session['sessioncontext']['related']['gridContext']['currentRecordId'])
    else:
        qti_d.setRange('QuestionID', None)

    totalCount = qti_d.count()

    #Словарь полей для одиночного и множественного выбора
    singleOrMultiChoice = [{"@id":u'HTML ответа'},
                           {"@id":u'Правильно', '@width': "50px"}]    
    #Словарь полей для вопросов типа 'заполнение формы'
    fillFormChoice = [{"@id":u"HTML ответа"}]    
    #Словарь полей для вопросов типа 'соответствие и классификация'
    relationClassChoice = [{"@id": u"HTML ответа"},
                           {"@id": u"HTML соответствия"}]    
    #Словарь полей для вопросов типа 'сортировка'
    sortChoice = [{"@id": u"Порядок ответа"},
                  {"@id": u"HTML ответа"}]

    meta = {"gridsettings":{
                "labels": {
                    "header": {"b":u"Варианты ответа"}},
                "columns": {"col":[]},
                "properties": {
                    "@flip":"false",
                    "@pagesize":50,
                    "@totalCount":totalCount,
                    "@gridWidth": "100%",
                    "@gridHeight": getGridHeight(session, 2),
                    "@profile":"default.properties"}}}
    
    if questionType in (1,2,7):
        meta["gridsettings"]["columns"]["col"].extend(singleOrMultiChoice)
    elif questionType == 3:
        meta["gridsettings"]["columns"]["col"].extend(fillFormChoice)
    elif questionType == 4 or questionType == 6:
        meta["gridsettings"]["columns"]["col"].extend(relationClassChoice)
    elif questionType == 5:
        meta["gridsettings"]["columns"]["col"].extend(sortChoice)
        
    return JythonDTO(None, XMLJSONConverter.jsonToXml(json.dumps(meta)))


def gridToolBar(context, main=None, add=None, filterinfo=None, session=None, elementId=None):
#    sessionjson = json.loads(session)
    heigth = "500"
    width = "850"
    if str(add) == "7":
        heigth = "800"
        width = "1080"        
    data = {"gridtoolbar": {
                "#sorted": [
                    {"item": {
                        "@text":u"Варианты ответа",
                        "@hint":u"Варианты ответа",
                        "@disable": "false",
                        "action": {
                            "@show_in":"MODAL_WINDOW",
                            "#sorted": [
                                {"main_context":'current'},
                                {"modalwindow": {
                                    "@caption":"Добавление/редактирование вариантов ответа",
                                    "@height": heigth,
                                    "@width": width}},
                                {"datapanel": {
                                    "@type":"current",
                                    "@tab":"current",
                                    "element": {
                                        "@id":'btzAnswersCard',
                                        "add_context": ''}}}]}}}]}}

    return XMLJSONConverter.jsonToXml(json.dumps(data))


def externalFilter(context, cursor, extfilter):
    u'''Применяем внешний фильтр на курсор. '''
    if extfilter['status'] != '-':
        cursor.setRange('status_id', extfilter['status'])
    if extfilter['exam_date_from'] != '' and extfilter['exam_date_to'] != '':
        cursor.setRange('exam_date', extfilter['exam_date_from'], extfilter['exam_date_to'])
    elif extfilter['exam_date_from'] != '' and extfilter['exam_date_to'] == '':
        cursor.setRange('exam_date', extfilter['exam_date_from'], '2100-01-01')
    elif extfilter['exam_date_from'] == '' and extfilter['exam_date_to'] != '':
        cursor.setRange('exam_date', '1900-01-01', extfilter['exam_date_to'])
    if extfilter['cath_id'] != '':
        cursor.setRange('cath_id', extfilter['cath_id'])
    if extfilter['spec_id'] != '':
        cursor.setRange('spec_id', extfilter['spec_id'])
    if extfilter['cycle_id'] != '':
        cursor.setRange('associated_cycle_id', extfilter['cycle_id'])
