# coding: utf-8
'''
@author: dgulyakin
'''
import json
from uuid import uuid4
from ru.curs.celesta.showcase.utils import XMLJSONConverter
from nci._nci_orm import test_matrixCursor, test_matrix_themesCursor,\
    global_settingsCursor
from qt._qt_orm import QtiQuestionCursor, QtiThemeCursor, QtiPackageCursor
try:
    from ru.curs.showcase.core.jython import JythonDTO
except:
    from ru.curs.celesta.showcase import JythonDTO


def cardData(context, main=None, add=None, filterinfo=None, session=None, elementId=None):
    u'''Карточка параметров варианта формирования теста'''    
    add_json = json.loads(add)
    
    action = add_json['action']
    
    params = {}
    variant_name = u''
    total_question_count = 0
    theme_json = {'theme': [
                {'selected_btz_id': '',
                 'package_name': '',
                 'package_question_count': 0,
                 'theme_id': '',
                 'theme_name': '',
                 'theme_question_count': 0,
                 'question_count': 0}]}
    
    global_settingsCur = global_settingsCursor(context)
    for item in global_settingsCur.iterate():
        params[item.id] = {'name': item.name, 'value': item.value}
    global_settingsCur.close()
        
    if action == 'edit':
        test_matrixCur = test_matrixCursor(context)
        if test_matrixCur.tryGet(add_json['tm_id']):
            variant_name = test_matrixCur.tm_name
            if test_matrixCur.params:
                params = json.loads(test_matrixCur.params)
            params['QuantityQuestions']['value'] = test_matrixCur.question_count
#             total_question_count = test_matrixCur.question_count
        test_matrixCur.close()
        
        test_matrix_themesCur = test_matrix_themesCursor(context)
        test_matrix_themesCur.setRange('tm_id', add_json['tm_id'])
        
        packageCur = QtiPackageCursor(context)
        qti_theme = QtiThemeCursor(context)
        qti_question = QtiQuestionCursor(context)
        
        theme_json['theme'] = []        
        for theme in test_matrix_themesCur.iterate():
            package_name = u''
            package_question_count = 0
            if packageCur.tryGet(theme.package_id):
                package_name = packageCur.PackageName            
            
            theme_id = theme.theme_id
            theme_name = u''
            theme_question_count = 0
            
            
            if theme_id:
                qti_question.setRange('ThemeID', theme_id)
                theme_question_count = qti_question.count()
                if qti_theme.tryGet(theme_id):
                    theme_name = qti_theme.ThemeName
            else:
                qti_theme.clear()
                qti_theme.setRange('PackageID', theme.package_id)
                for qti_theme in qti_theme.iterate():
                    qti_question.setRange('ThemeID', qti_theme.ThemeID)
                    package_question_count += qti_question.count()               
                
            theme_json['theme'].append({'selected_btz_id': theme.package_id,
                                        'package_name': package_name,
                                        'package_question_count': package_question_count,
                                        'theme_id': theme_id,
                                        'theme_name': theme_name,
                                        'theme_question_count': theme_question_count,
                                        'question_count': theme.question_count})
        
        qti_question.close()
        qti_theme.close()
        packageCur.close()    
        test_matrix_themesCur.close
        
    
    xformsdata = {"schema": {
            "@xmlns":"", 
            'speciality': add_json['speciality'], 
            'speciality_id': add_json['speciality_id'],
            'variant_name': variant_name,
            'error_message': '',
            'total_question_count': total_question_count,
            'params': params,
            'themes': theme_json,
            'template': {
                'theme':{
                    'selected_btz_id': '',
                    'package_name': '',
                    'package_question_count': 0,
                    'theme_id': '',
                    'theme_name': '',
                    'theme_question_count': 0,
                    'question_count': 0}}}}
    
    xformssettings = {"properties": {
                        "event": [
                            {"@name":"single_click",
                             "@linkId": "1",
                             "action": {
                                '#sorted': [
                                    {"main_context": "current"},
                                    {"datapanel": {"@type": "current",
                                        "@tab": "current",
                                        "element": {
                                            "@id":"testSettingsGrid",
                                            "add_context": ""}}}]}}]}}

    return JythonDTO(XMLJSONConverter.jsonToXml(json.dumps(xformsdata)),
                     XMLJSONConverter.jsonToXml(json.dumps(xformssettings)))

    
def cardSave(context, main=None, add=None, filterinfo=None, session=None, elementId=None, xformsdata=None):
    u'''Сохранение глобальных параметров'''
    data_dict = json.loads(xformsdata)["schema"]
    add_json = json.loads(add)
    
    action = add_json['action']    
    
    test_matrixCur = test_matrixCursor(context)
    
    if action == 'add':
        test_variant_id = unicode(uuid4())
    
        test_matrixCur = test_matrixCursor(context)
        test_matrixCur.setRange('speciality_id', data_dict['speciality_id'])
        test_matrixCur.setRange('tm_name', data_dict['variant_name'])
        if test_matrixCur.tryFirst():
            test_matrixCur.close()
            context.error(u'Конфигурация с именем "{}" для данной специальности уже есть'.format(data_dict['variant_name']))
        
        test_matrixCur.clear()
        test_matrixCur.tm_id = test_variant_id
        test_matrixCur.tm_name = data_dict['variant_name']
        test_matrixCur.speciality_id = data_dict['speciality_id']
        test_matrixCur.question_count = int(data_dict['params']['QuantityQuestions']['value'])
        test_matrixCur.params = json.dumps(data_dict['params'])
        test_matrixCur.insert()
        test_matrixCur.close()
    else:
        test_variant_id = add_json['tm_id']
        test_matrixCur.setRange('speciality_id', data_dict['speciality_id'])
        test_matrixCur.setFilter('tm_id', """!'{}'""".format(test_variant_id))
        test_matrixCur.setRange('tm_name', data_dict['variant_name'])
        if test_matrixCur.tryFirst():
            test_matrixCur.close()
            context.error(u'Конфигурация с именем "{}" для данной специальности уже есть'.format(data_dict['variant_name']))
        
        test_matrixCur.clear()
        if test_matrixCur.tryGet(test_variant_id):
            test_matrixCur.tm_name = data_dict['variant_name']
            test_matrixCur.question_count = int(data_dict['params']['QuantityQuestions']['value'])
            test_matrixCur.params = json.dumps(data_dict['params'])
            test_matrixCur.update()
        
    test_matrixCur.close()
    
    themes = data_dict['themes']['theme']
    if not isinstance(themes, list):
        themes = [themes]    
    
    test_matrix_themesCur = test_matrix_themesCursor(context)
    if action == 'edit':
        test_matrix_themesCur.setRange('tm_id', test_variant_id)
        test_matrix_themesCur.deleteAll()
    
    for theme in themes:
        test_matrix_themesCur.clear()
        test_matrix_themesCur.tm_id = test_variant_id
        test_matrix_themesCur.package_id = theme['selected_btz_id']
        test_matrix_themesCur.theme_id = theme['theme_id']
        test_matrix_themesCur.question_count = int(theme['question_count'])
        test_matrix_themesCur.insert()
    test_matrix_themesCur.close()