# 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
from common.sysfunctions import getGridHeight, getGridWidth
from qt._qt_orm import QtiQuestionCursor, QtiThemeCursor

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=None, add=None, filterinfo=None,
             session=None, elementId=None, sortColumnList=None, firstrecord=None, pagesize=None):
    u'''Функция получения данных для грида. '''
    
    u"""ID выделенной темы"""
    currentId = main
#     currentId = json.loads(session)["sessioncontext"]["related"]["gridContext"]["currentRecordId"]
    
    u"""Курсор таблицы serviceCatalog"""
    question = QtiQuestionCursor(context)
    
    u"""Выбор вопросов по выделенной теме"""
    question.setRange('ThemeID', currentId)
    u"""Определение переменной для JSON-данных"""
    data = {"records":{"rec":[]}}
 
    u"""Заголовки для столбцов грида"""
    _headers = {'id': ["~~id"],
                'QuestionHtml': [u'Html вопроса'],
                'QuestionImg': [u'Изображение вопроса'],
                'QuestionNumber': [u'Номер вопроса'],
                'QuestionType':[u'Тип вопроса'],
                'ThemeID':[u'ID темы'],
                'QuestionHtml2':[u'Html2 вопроса'],
                "properties": ["properties"]}
           
    u"""Приведение названий столбцов к формату поддерживаемому XML файлами"""    
    for column in _headers:
        _headers[column].append(toHexForXml(_headers[column][0]))
                
    u"""Ограничение единовременно отображаемых данных в гриде""" 
    question.limit(firstrecord - 1, pagesize)
    question.orderBy('QuestionOrder')

    q_types = {1: u'Одиночный выбор',
           2: u'Множественный выбор',
           3: u'Заполнение формы',
           4: u'Соответствие',
           5: u'Сортировка',
           6: u'Классификация',
           7: u'Карта-изображение',
           '': u'Не указан'}
    
    u"""Получения данных из таблицы serviceCatalog для отображения их в гриде"""
    for question in question.iterate():
        questions_dict = {}
        questions_dict[_headers['id'][1]] = question.QuestionID
        questions_dict[_headers['QuestionHtml'][1]] = question.QuestionHtml.replace(' ', ' ')
        questions_dict[_headers['QuestionHtml2'][1]] = question.QuestionHtml2.replace(' ', ' ') if question.QuestionHtml2 else None
        questions_dict[_headers['QuestionNumber'][1]] = question.QuestionOrder
        questions_dict[_headers['QuestionType'][1]] = q_types[question.QuestionType] if question.QuestionType is not None else u'Не указан'        
        questions_dict[_headers['properties'][1]] = {"event": {
                                                        "@name":"row_single_click",
                                                        "action": {
                                                            "#sorted": [
                                                                {"main_context": "current"},
                                                                {"datapanel": {
                                                                    '@type':"current",
                                                                    '@tab':"current",
                                                                    'element': {
                                                                        "@id": "btzAnswerGrid",
                                                                        "add_context": {"#text": question.QuestionType}}}}]}}}                
        data["records"]["rec"].append(questions_dict)    
    u"""Конвертация JSON-данных в XML"""
    data = XMLJSONConverter.jsonToXml(json.dumps(data))
    
    return JythonDTO(data, None)


def gridMeta(context, main, add=None, filterinfo=None,
             session=None, elementId=None):
    u"""Функция получения параметров для грида"""
    currentId = main
#     currentId = json.loads(session)["sessioncontext"]["related"]["gridContext"]["currentRecordId"]
    #Заголовки для столбцов грида
    _headers = {'id': ["~~id"],
                'QuestionHtml': [u'Html вопроса'],
                'QuestionNumber': [u'Номер вопроса'],
                'QuestionType':[u'Тип вопроса'],
                'ThemeID':[u'ID темы'],
                'QuestionHtml2':[u'Html2 вопроса'],
                "properties": ["properties"]}
    #Количество записей в таблице
    question = QtiQuestionCursor(context)
    question.setRange('ThemeID', currentId)
    totalcount = question.count()
    question.close()
    #Наименование темы
    qti_theme = QtiThemeCursor(context)
    qti_theme.get(currentId)
    themeName = qti_theme.ThemeName
    qti_theme.close()    
    #Настройки грида
    settings = {}
    settings["gridsettings"] = {"columns": {
                            "col":[
                                {"@id":_headers["QuestionNumber"][0]},
                                {"@id":_headers["QuestionType"][0]},
                                {"@id":_headers["QuestionHtml"][0]},
                                {"@id":_headers["QuestionHtml2"][0]}]},
                            "labels": {"header": {"b": u'Вопросы по теме "%s"' % (themeName)}},
                            "properties": {
                                "@gridHeight": getGridHeight(session, 2),
                                "@gridWidth": '100%',
                                "@totalCount": totalcount,
                                "@pagesize": "50"}}
 
    return JythonDTO(None, XMLJSONConverter.jsonToXml(json.dumps(settings)))

def gridToolBar(context, main=None, add=None, filterinfo=None, session=None, elementId=None):
    u"""Функция отображения панели инструментов"""
    session = json.loads(session)['sessioncontext']    
    try:
        questionId = session["related"]["gridContext"]["currentRecordId"]
    except:
        questionId = None
    #Переменная для задания стиля отображения кнопок
    style = "false" if questionId else 'true'        
    #Настройка toolbar
    data = {"gridtoolbar": {
                "item": [
                    {"@img": 'gridToolBar/addDirectory.png',
                     "@text":u"Добавить",
                     "@hint":u"Добавить вопрос",
                     "@disable": "false",
                     "action": {
                        "@show_in": "MODAL_WINDOW",
                        "#sorted": [
                            {"main_context":"current"},
                            {"modalwindow": {
                                "@caption": u"Добавление вопроса",
                                "@height": "560",
                                "@width": "640"}},
                            {"datapanel": {
                                "@type": "current",
                                "@tab": "current",
                                "element": [
                                    {"@id": "webQuestionAddEditCard",
                                     "add_context":"add"}]}}]}},
                    {"@img": 'gridToolBar/editDocument.png',
                     "@text":u"Редактировать",
                     "@hint":u"Редактировать вопрос",
                     "@disable": style,
                     "action": {
                        "@show_in": "MODAL_WINDOW",
                        "#sorted": [
                            {"main_context":"current"},
                            {"modalwindow": {
                                "@caption": u"Редактирование вопроса",
                                "@height": "560",
                                "@width": "640"}},
                            {"datapanel": {
                                "@type": "current",
                                "@tab": "current",
                                "element": {
                                    "@id": "webQuestionAddEditCard",
                                    "@keep_user_settings": "true",
                                    "add_context": "edit"}}}]}},
                    {"@img": 'gridToolBar/deleteDocument.png',
                     "@text":u"Удалить",
                     "@hint":u"Удалить вопрос",
                     "@disable": style,
                     "action": {
                        "@show_in": "MODAL_WINDOW",
                        "#sorted": [
                            {"main_context":"current"},
                            {"modalwindow": {
                                "@caption": u"Удаление вопроса",
                                "@height": "110",
                                "@width": "360"}},
                            {"datapanel": {
                                "@type": "current",
                                "@tab": "current",
                                "element": [
                                    {"@id": "webQuestionDeleteCard",
                                     "add_context":"delete"}]}}]}},                   
                    {"@text":u"Отладка вопросов",
                     "@hint":u"Отладка вопросов",
                     "@disable":style,
                     "action": {
                        "@show_in":"MODAL_WINDOW",
                        "#sorted": [
                            {"main_context":'current'},
                            {"modalwindow": {
                                "@caption":u"Отладка вопросов",
                                "@height":"320",
                                "@width":"450"}},
                            {"datapanel": {
                                "@type":"current",
                                "@tab":"current",
                                "element": {
                                    "@id":'debugQuestionCard',
                                    "add_context": "question"}}}]}}]}}    
    return XMLJSONConverter.jsonToXml(json.dumps(data))