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

☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦
@author: tr0glo)|(I╠╣
☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦
'''

import datetime
import json
import random
from java.sql import Timestamp
from java.util import Date
from uuid import uuid4

from qt._qt_orm import QtiVariantCursor, ContentCursor, \
    Content_AttributeValueCursor, listAttributeContentCursor, \
    TestingVariantAssignCursor, QtiQuestionCursor, QtiThemeCursor, \
    QtiVariantQuestionCursor, QtiVariantDestructorCursor, QtiDestructorCursor, \
    QtiVariantAnswerCursor, QtiVariantParamsCursor
    
from qt.functions import getShowCorrectAnswerPermission, generateVariant, getAttributeValue, \
                         getPermissionForViewTest, getGlobalAttributeValue, createTestingVariantAssign,\
                         generateThemesVariant, generateQuestionsVariant
 

def navigator_qt(context, session):
    '''Навигатор тестирования'''
    session = json.loads(session)  
    resultJSON = {"group":{"@id": "testing",
                       "@name": u"Тестирование",
                       "level1":[]}}
    
#     username = session['sessioncontext']['username']
    sid = session['sessioncontext']['sid']
    personId = session['sessioncontext']['login']
    catalogBTZFlag = False
    # Если urlparams пусты, то отображается каталог БТЗ. Если есть параметр mode, то открываем тест в режиме отладки или проверки, иначе открывается тест для прохождения слушателем
    if 'urlparam' in session['sessioncontext']['urlparams']:
        urlparams = session['sessioncontext']['urlparams']['urlparam']
        if not isinstance(urlparams, list):
            urlparams = [urlparams]
        modeFlag = False
        debugFlag = False
        testFlag = False
        themeFlag = False
        questionFlag = False
        themeList = []
        questionList = []
        for urlparam in urlparams:
            urlparam['@name'] = urlparam['@name'].replace('amp;','')
            if urlparam['@name'] == 'param':
                variantId = urlparam['@value'][0]
            elif urlparam['@name'] == 'package':
                packageId = urlparam['@value'][0]
            elif urlparam['@name'] == 'mode':
                modeFlag = True
                mode = urlparam['@value'][0]
                if mode == 'debug':
                    debugFlag = True
                if mode == 'test':
                    testFlag = True
                if mode == 'theme':
                    themeFlag = True
                if mode == 'question':
                    questionFlag = True
            elif urlparam['@name'] == 'theme':
                themeList = urlparam['@value']
            elif urlparam['@name'] == 'question':
                questionList = urlparam['@value']
        if not testFlag:         
            if modeFlag:
                # Проверка разрешения на просмотр правльных ответов
                if (debugFlag or themeFlag or questionFlag) and not getShowCorrectAnswerPermission(context, session, variantId):
                    return context.message(u'У текущего пользователя нет разрешения на просмотр данной страницы')
            else:
                # Проверка разрешешния на доступ к тестированию
                if not getPermissionForViewTest(context, session, variantId):
                    return context.message(u'У текущего пользователя нет разрешения на просмотр данной страницы')
    else:
        catalogBTZFlag = True
#     if not checkParams(QtiVariantParams, variantId):
#         return context.message(u'Не заданы настройки тестирования.')
    if catalogBTZFlag:
        return context.error(u'Неправильная ссылка')
    else:
        TVA = TestingVariantAssignCursor(context)
        if TVA.tryGet(variantId):
            pass
        else:
            if testFlag or debugFlag or themeFlag or questionFlag:
                createTestingVariantAssign(context, variantId, packageId, sid, personId, None)
        
        TVA.get(variantId)
        packageId = TVA.PackageID
    
        datetimeStart = TVA.DateAssign if TVA.DateAssign is not None else Timestamp(Date())
        TVA.close()
        
        QtiVariant = QtiVariantCursor(context)
        hasVariant = QtiVariant.tryGet(variantId)
        QtiVariant.close()
        # Если варианта нет, то генерируем его
        if not hasVariant:
            if themeFlag:
                generateThemesVariant(context,packageId,variantId,themeList)
            elif questionFlag:
                generateQuestionsVariant(context,packageId,variantId,questionList)
            else:
                generateVariant(context, packageId, variantId, debugFlag)
            
            # Опеределям время на тест.В режиме отладки даются сутки на прохождение тестирования
#             timeTest = getGlobalAttributeValue(Content,Content_Attribute,listAttributeContent,packageId,'TimeTest')
            QtiVariantParams = QtiVariantParamsCursor(context)
            timeTest = getAttributeValue(QtiVariantParams, variantId, 'TimeTest')
            QtiVariantParams.close()
            
            if debugFlag or themeFlag or questionFlag:
                timeTest = 1440
            
            if timeTest is None or timeTest == '':
                timeTest = 20
            else:
                timeTest = int(timeTest)
                

            QtiVariantAnswer = QtiVariantAnswerCursor(context)        
            QtiVariantAnswer.VariantAnswerID = unicode(uuid4())
            QtiVariantAnswer.VariantID = variantId
            QtiVariantAnswer.TimeBegin = Date()
            QtiVariantAnswer.TimeEnd = Timestamp(datetimeStart.getTime() + timeTest * 60 * 1000)
            QtiVariantAnswer.insert()
            QtiVariantAnswer.close()
                 
        # Пункт навигатора со стартовой страницей
        resultJSON["group"]["level1"].append({"@id": "ID_START",
                                              "@name": u"Начало",
                                              "@selectOnLoad": "true",
                                              "action":{
                                                  "#sorted": [
                                                      {"main_context": variantId},
                                                      {"datapanel":{"@type": "qt.datapanel.datapanel_qt.startDatapanel.cl"}
                                                      }]}
                                              })
        
        # Каждый вопрос расположен в отдельном пункте навигатора.
        # Цикл по вопросам
        QtiQuestion = QtiQuestionCursor(context)
        QtiVariantQuestion = QtiVariantQuestionCursor(context)
        QtiVariantQuestion.setRange('VariantID', variantId)
        for QtiVariantQuestion in QtiVariantQuestion.iterate():
            QtiQuestion.get(QtiVariantQuestion.QuestionID)
            datapanelType = ''
            # В зависимости от типа вопроса, подставляются разные датапанели
            if QtiQuestion.QuestionType == 1:
                datapanelType = 'qt.datapanel.datapanel_qt.simpleQuestionDatapanel.cl'
            elif QtiQuestion.QuestionType == 2:
                datapanelType = 'qt.datapanel.datapanel_qt.multiQuestionDatapanel.cl'
            elif QtiQuestion.QuestionType == 3:
                datapanelType = 'qt.datapanel.datapanel_qt.textQuestionDatapanel.cl'
            elif QtiQuestion.QuestionType == 4:
                datapanelType = 'qt.datapanel.datapanel_qt.corrQuestionDatapanel.cl'
            elif QtiQuestion.QuestionType == 5:
                datapanelType = 'qt.datapanel.datapanel_qt.sortQuestionDatapanel.cl'
            elif QtiQuestion.QuestionType == 6:
                datapanelType = 'qt.datapanel.datapanel_qt.classificationQuestionDatapanel.cl'
            elif QtiQuestion.QuestionType == 7:
                datapanelType = 'qt.datapanel.datapanel_qt.simpleImageMapQuestionDatapanel.cl'
                
            resultJSON["group"]["level1"].append({"@id": QtiVariantQuestion.VariantQuestionID,
                                                  "@name": u"Вопрос №%s" % (QtiVariantQuestion.QuestionID),
                                                  "@selectOnLoad": "false",
                                                  "action":{
                                                  "#sorted": [
                                                      {"main_context": QtiVariantQuestion.VariantQuestionID},
                                                      {"datapanel":{"@type": datapanelType}}]}})        
        QtiVariantQuestion.close()
        QtiQuestion.close()
        # Пункт навигатора со страницей резульатов тестирования
        resultJSON["group"]["level1"].append({"@id": "ID_FINISH",
                                              "@name": u"Окончание",
                                              "action":{
                                                  "#sorted": [
                                                      {"main_context": variantId},
                                                      {"datapanel": {
                                                          "@type": "qt.datapanel.datapanel_qt.finishDatapanel.cl"}}]}})
    
        # Пункт навгатора со списком вопросов
        resultJSON["group"]["level1"].append({"@id": "ID_CONTENTS",
                                              "@name": u"Оглавление",
                                              "action":{
                                                  "#sorted": [
                                                      {"main_context": variantId},
                                                      {"datapanel": {
                                                          "@type": "qt.datapanel.datapanel_qt.contentDatapanel.cl"}}]}}) 
           
    return resultJSON


def navSettings(context, session):    
    session = json.loads(session)
    # В режиме прохождения тестирования навигатор скрывается, все переходы между пунктами навигатора осущетвляются действиями в карточках
    if 'urlparam' not in session['sessioncontext']['urlparams']:   
        myNavigator = {
            "@width": "250px",
            "@hideOnLoad": "false"
        }
    else:
        myNavigator = {
            "@width": "250px",
            "@hideOnLoad": "true"
        }
   
    return myNavigator
