# coding: utf-8
'''
Created on 24.07.2015
@author: tr0glo)|(I╠╣
'''

import json

from qt._qt_orm import QtiPackageCursor, QtiThemeCursor
from ru.curs.celesta.showcase.utils import XMLJSONConverter
from security.functions import userHasPermission
from author.functions.getUrlParams import getUrlParam

def navigator_catalog(context, session):
    '''Навигатор тестирования'''
    session = json.loads(session)
    resultJSON = {"group":{"@id": "catalogNav",
                       "@name": u"Каталог ЭОР",
                       "level1":[]}}
    #Заблокировано для cetif_class редактирование БТЗ должно производится в основном приложении
    if (1==1):
        levelText = {'@id': 'levelText',
            '@name': 'Доступно в главном приложении СДО (certif)',
            }
        resultJSON["group"]["level1"].append(levelText) 
        return resultJSON
    sid = session['sessioncontext']['sid']
    if not userHasPermission(context, sid, "navigatorAuthor"):
        context.error(u"У пользователя нет доступа")
    
    if 'urlparam' not in session['sessioncontext']['urlparams']:        
        # Катадог БТЗ
        itemsBTZ = []        
        itemsBTZ.append({"@id": "catalogBTZ",
                              "@name": u"Каталог БТЗ",
                              "@selectOnLoad": "false",
                              "action":{
                                  "#sorted": [
                                      {"main_context": ""},
                                      {"datapanel":{"@type": "author.datapanel.datapanel_author.catalogDatapanel.cl"}}]}})
        
        itemsBTZ.append({"@id": "webServiceCatalog",
                                  "@name": u"Каталог веб сервисов",
                                  "@selectOnLoad": "false",
                                  "action": {
                                      "#sorted": [
                                          {"main_context": "current"},
                                          {"datapanel": {
                                             "@type": "author.datapanel.datapanel_webServiceCatalog.catalogDatapanel.celesta",
                                             "@tab": "firstOrCurrent"}}]}})
        
        itemsBTZ.append({"@id": "subscribedServiceCatalog",
                              "@name": u"Каталог подписанных сервисов",
                              "@selectOnLoad": "false",
                              "action":{
                                  "#sorted": [
                                      {"main_context": ""},
                                      {"datapanel":{"@type": "author.datapanel.datapanel_subscribedServiceCatalog.catalogDatapanel.cl"}}]}})        
        levelBTZ = {'@id': 'levelBTZ',
            '@name': 'БТЗ',
            '#sorted': [{'level2': itemsBTZ}]}
    
        resultJSON["group"]["level1"].append(levelBTZ)        
        # Катадог Лекций
        itemsVideoLecture = {"@id": "catalogVideoLecture",
                              "@name": u"Лекции",
                              "@selectOnLoad": "false",
                              "action":{
                                  "#sorted": [
                                      {"main_context": ""},
                                      {"datapanel":{"@type": "author.datapanel.datapanel_author.catalogLectureDatapanel.cl"}}]}}
        
        resultJSON["group"]["level1"].append(itemsVideoLecture)
        # Катадог Практических занятий
        itemsPractical = {"@id": "catalogPractical",
                              "@name": u"Практические занятия",
                              "@selectOnLoad": "false",
                              "action":{
                                  "#sorted": [
                                      {"main_context": ""},
                                      {"datapanel":{"@type": "author.datapanel.datapanel_author.catalogPracticalDatapanel.cl"}}]}}
        
        #resultJSON["group"]["level1"].append(itemsPractical)
    else:   
        isCorrect = checkUrlParams(session, context)        
        if isCorrect:
            packageId = getUrlParam(session, 'package')
            packageCur = QtiPackageCursor(context)
            if packageCur.tryGet(packageId):
                packageName = packageCur.PackageName
            else:
                context.error(u'Ошибка при получении имени БТЗ по ИД="{}"'.format(packageId))
            packageCur.close
                
            packageJSON = {"@id": "webServiceCatalog",
                          "@name": u'БТЗ "{}"'.format(packageName),
                          "@selectOnLoad": "true",
                          "#sorted": [
                              {"action": {
                                  "#sorted": [
                                      {"main_context": "current"},
                                      {"datapanel": {
                                           "@type": "author.datapanel.datapanel_webThemeAndQuestion.catalogDatapanel.celesta",
                                           "@tab": "firstOrCurrent"}}]}}]}
            
            packageThemes = []
            themesCur = QtiThemeCursor(context)
            themesCur.setRange('PackageID', packageId)
            themesCur.orderBy('ThemeOrder')
            for themeItem in themesCur.iterate():
                themeId = themeItem.ThemeID
                themeJson = {
                    '@id': 'theme-{}'.format(themeId),
                    '@name': themeItem.ThemeName,
                    'action': {
                        '#sorted': [
                            {'main_context': themeId},
                            {'datapanel': {
                                '@type': 'author.datapanel.datapanel_webThemeAndQuestion.catalogThemeDatapanel.celesta',
                                '@tab': 'firstOrCurrent'}}]}}
                packageThemes.append(themeJson)
            themesCur.close()
            
            if packageThemes:
                packageJSON['#sorted'].append({'level2': packageThemes}) 
                
            resultJSON['group']['level1'].append(packageJSON)                
                
    if not resultJSON['group']['level1']:
        resultJSON = {"group": None}
    return resultJSON


def navSettings(context, session):
    u"""Функция выставляет настройки навигатора. Поменять параметры myNavigator при необходимости"""    
    session = json.loads(session)    
    if session['sessioncontext']['userdata'] == 'qtAuthor':
        if 'urlparam' not in session['sessioncontext']['urlparams']:   
            myNavigator = {"@width": "250px",
                           "@hideOnLoad": "false"}
        else:
            myNavigator = {"@width": "250px",
                           "@hideOnLoad": "true"}
    else:
        u"""Если url параметры не присутствуют """
        if 'urlparam' not in session['sessioncontext']['urlparams']:   
            myNavigator = {"@width": "250px",
                           "@hideOnLoad": "false"}
        else:          
            u"""Если url параметры присутствуют """
            myNavigator = {"@width": "250px",
                           "@hideOnLoad": "false"}        
    return myNavigator


def checkUrlParams(session, context):
    u"""Функция проверяет правильность введенных url параметров"""
    u"""Возвращает True если параметры верны"""
    
    u"""Ожидаемые url параметры"""
    requiredParameters = ["mode", "package"]
    u"""Количество ожидаемых url параметров"""
    numberOfRequiredParameters = len(requiredParameters)
    u"""Количество полученных url параметров"""
    numberOfRecievedParameters = 0
    u"""Полученные параметры"""
    recievedParameters = []
    
    urlparams = session['sessioncontext']['urlparams']['urlparam']
    if not isinstance(urlparams, list):
        urlparams = [urlparams]
        
    u"""Проверка параметров @name"""    
    for urlparam in urlparams:
        if urlparam["@name"] not in requiredParameters:
            context.error(u"Недопустимый параметр '%s'! Список допустимых параметров: %s" % (urlparam["@name"], requiredParameters))
            return False
        
        elif urlparam["@name"] == "mode":
            if len(urlparam["@value"]) > 1:
                context.error(u"Лишний параметр mode")
                
            u"""Проверка значения для параметра @name"""
            for var in urlparam["@value"]:
                # if ''.join(var.split()) != "btz":
                if var.strip() != "btz":
                    context.error(u"Ошибка! Значение '%s' недопустимо для параметра 'mode'" % (var))
                    return False
            numberOfRecievedParameters += 1
            recievedParameters.append("mode")
            
        elif urlparam["@name"] == "package":
            if len(urlparam["@value"]) > 1:
                context.error(u"Лишний параметр package")
            qt_qtilPackage = QtiPackageCursor(context)
            
            u"""Получение packageId из url запроса"""
            for packageId in urlparam["@value"]:
                # packageId = ''.join(packageId.split()) Был косяк в платформе
                u"""Проверка присутствия полученного packageId в таблице qt.qtilPackage"""
                if not qt_qtilPackage.tryGet(packageId):
                    context.error(u"Ошибка! Несуществующий packageId для параметра 'package'")
                    return False
            numberOfRecievedParameters += 1
            recievedParameters.append("package")
    
#     if numberOfRecievedParameters < numberOfRequiredParameters:
    if len(recievedParameters) < numberOfRequiredParameters:
        context.error(u"Недостаточно url параметров. Список необходимых параметров: %s. Список полученных параметров: %s." % (requiredParameters, recievedParameters))
    else:
        return True
