# coding: utf-8
'''
Created on 27.07.2015
☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦
@author: tr0glo)|(I╠╣
☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦
'''
from java.util import Date
from java.sql import Timestamp
import json
from uuid import uuid4
    
from qt.functions import getAttributeValue, completeTest
from ru.curs.celesta.showcase.utils import XMLJSONConverter

try:
    from ru.curs.showcase.core.jython import JythonDTO
    from ru.curs.showcase.core.jython import JythonDownloadResult
except:
    from ru.curs.celesta.showcase import JythonDTO

from qt._qt_orm import TestingVariantAssignCursor, QtiVariantCursor, \
    QtiVariantQuestionCursor, QtiVariantAnswerCursor, ContentCursor, \
    Content_AttributeValueCursor, listAttributeContentCursor,\
    QtiPackageAttributeCursor, QtiVariantParamsCursor    
    


def cardData(context, main=None, add=None, filterinfo=None, session=None, elementId=None):
    u'''Карточка старта тестирования. '''    
    session = json.loads(session)

    variantId = main
    
    TVA = TestingVariantAssignCursor(context)
    TVA.get(variantId)
    packageId = TVA.PackageID
    TVA.close()
    
    QtiVariant = QtiVariantCursor(context)
    QtiVariant.get(variantId)    
    variantName = QtiVariant.VariantName
    QtiVariant.close()
    
    QtiVariantAnswer = QtiVariantAnswerCursor(context)
    QtiVariantAnswer.setRange('VariantID',variantId)
    QtiVariantAnswer.first()
    #Определяем завершен ли тест
    if QtiVariantAnswer.TimeFinish is not None or Date() > QtiVariantAnswer.TimeEnd:
        QtiVariantAnswer.TimeFinish = QtiVariantAnswer.TimeEnd
        QtiVariantAnswer.update()
        testingStatus = '2'
        completeTest(context,variantId)
    else:
        testingStatus = '1'
        
    QtiVariantAnswer.close()
 
#     testingAlgorithm = getAttributeValue(Content,Content_Attribute,listAttributeContent,packageId,'TestName')
 
#     if testingAlgorithm is None:
    testingAlgorithm = u'Тестирование'
        
    attributeList = list()
    
    QtiPackageAttribute = QtiPackageAttributeCursor(context)
    QtiPackageAttribute.setRange('PackageID',packageId)
    
    #Атрибуты тестирования для отображения в карточке
    for attribute in QtiPackageAttribute.iterate():
        if attribute.AttributeName is not None and attribute.AttributeValue is not None\
        and attribute.AttributeName in [u'Учебная дисциплина', u'Модуль', u'Название теста', u'Способ прохождения тестирования', u'Количество заданий', u'Ограничение времени']:
            attributeList.append({"@id":attribute.AttributeID,
                                  "@name":attribute.AttributeName,
                                  "@value":attribute.AttributeValue
                                  })
    QtiPackageAttribute.close()
    
    QtiVariantQuestion = QtiVariantQuestionCursor(context)
    QtiVariantQuestion.setRange('VariantID',variantId)
    questionCount = QtiVariantQuestion.count()
    
    xformsdata = {"schema": {
                    "@xmlns":"",
                    "description": {
                        "TestingAlgorithm": testingAlgorithm,
                        "testingStatus": testingStatus,
                        "personPhoto": '',
                        "VariantName": variantName,
                        "QuestionCount": questionCount},
                    "attributes":
                        {"attribute":attributeList}}}
    
    #Определяем идентификатор первого вопроса
    QtiVariantQuestion.setRange("QuestionNumber",1)
    QtiVariantQuestion.first()    
    VariantQuestionId = QtiVariantQuestion.VariantQuestionID
    QtiVariantQuestion.close()    
    
    if testingStatus == '1':
        #Если тестирование не завершено, то доступен переход к первому вопросу
        xformssettings = {"properties": {
                            "event": [
                                {"@name":"single_click",
                                 "@linkId": "1",
                                 "action":{
                                    "#sorted": [
                                        {"navigator": {"@element":VariantQuestionId}}]}}]}}
    else:
        #Если тестирование завершено, то доступны переходы к списку вопросов и результатам тестирования
        xformssettings = {"properties": 
                            {"event": [
                                {"@name":"single_click",
                                 "@linkId": "1",
                                 "action":{
                                    "#sorted": [
                                        {"navigator": {"@element":'ID_CONTENTS'}}]}},
                            {"@name":"single_click",
                             "@linkId": "2",
                             "action": {
                                "#sorted": [
                                    {"navigator": {"@element":'ID_FINISH'}}]}}]}}

    #print XMLJSONConverter(input=xformsdata).parse(), XMLJSONConverter(input=xformssettings).parse()
    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'''Карточка сохранения стартовой страницы.В ней генерируется вариант, если он её не был сгенерирован'''
    variantId = main
    
    TVA = TestingVariantAssignCursor(context)
    TVA.get(variantId)    
#     packageId = TVA.PackageID    
    AlgorithmTestingId = TVA.AlgorithmTestingID
    TVA.close()
    
    QtiVariantAnswer = QtiVariantAnswerCursor(context)
    QtiVariantAnswer.setRange('VariantID',variantId)
    
    if AlgorithmTestingId != 2 and QtiVariantAnswer.count() == 0:    
        QtiVariantParams = QtiVariantParamsCursor(context)    
        timeTest = getAttributeValue(QtiVariantParams, variantId, 'TimeTest')
        QtiVariantParams.close()
            
        if timeTest is None:
            timeTest = 20
        else:
            timeTest = int(timeTest)        
       
        QtiVariantAnswer.VariantAnswerID = unicode(uuid4())
        QtiVariantAnswer.VariantID = variantId
        QtiVariantAnswer.TimeBegin = Timestamp(Date())
        QtiVariantAnswer.TimeEnd = Timestamp(QtiVariantAnswer.TimeBegin.getTime() + timeTest*60*1000)
        QtiVariantAnswer.insert()
        
    QtiVariantAnswer.close()