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

@author: i.lopatin

'''
import json

from common._common_orm import linesOfNumbersSeriesCursor
from common._common_orm import numbersSeriesCursor
from common.numbersseries import getNextNo
from ru.curs.celesta.showcase.utils import XMLJSONConverter
from qt._qt_orm import QtiQuestionCursor, QtiThemeCursor
from java.text import SimpleDateFormat
from java.util import Date

try:
    from ru.curs.showcase.core.jython import JythonDTO
    from ru.curs.showcase.core.selector import ResultSelectorData
    from ru.beta2.extra.gwt.ui.selector.api import DataRecord
except:
    from ru.curs.celesta.showcase import JythonDTO, DataRecord, ResultSelectorData

def cardData(context, main=None, add=None, filterinfo=None, session=None, elementId=None):
   
    u'''Процедура для отрисовки данных карточки. '''

        
    theme = QtiThemeCursor(context)

    u"""Получение набора всего набора полей из данной таблицы"""
    gridContext = json.loads(session)['sessioncontext']['related']['gridContext']
        
    if 'currentRecordId' in gridContext:
        currRecordId = gridContext["currentRecordId"]
        
    u"""Выбор карточки 'Редактировать' или 'Удалить'"""
    if add == 'edit':
        if currRecordId:
            theme.get(currRecordId)  
    
    u"""Данные для полей на карточке"""    
    xformsdata = {"schema":{"themeData": {"@add":add,
                                            "@ThemeName": theme.ThemeName,
                                            "@ParentTheme": theme.ParentTheme,
                                            "@PackageID": theme.PackageID,
                                           }
                            }
                  }
    
    xformssettings = {"properties":{"event":{"@name":"single_click",
                                             "@linkId": "1",
                                             "action":{
                                                  "#sorted": [
                                                      {"main_context": "current"},
                                                      {"datapanel": {"@type": "current",
                                                                     "@tab": "current",
                                                                     "element": {"@id":"webThemeGrid",
                                                                                 "add_context": ""}
                                                                     }
                                                      }]}
                                             },
                                    
                                    }
                      }
    
    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'''Процедура сохранения'''  

    u"""Получение набора полей, в которых будут проводиться изменения"""  
    content = json.loads(xformsdata)["schema"]["themeData"]

    u"""Получение набора всего набора полей из данной таблицы"""
    idContent = json.loads(session)['sessioncontext']['related']['gridContext']
    
    u"""Создание интсрументов для работы с датой"""  
    dateFormat = SimpleDateFormat("yyyy-MM-dd")
    date = dateFormat.format(Date())  # Сегодняшняя дата
    
    u"""Создание курсоров для таблиц qtiThemes, numbersSeries и linesOfNumbersSeries"""
    theme = QtiThemeCursor(context)
    numberSeries = numbersSeriesCursor(context)
    linesOfNumbersSeries = linesOfNumbersSeriesCursor(context)
    

    u""" Проверка выбранной карточки"""
    if add == "add":  
        u"""Значение для поля id в таблице numbersSeries"""
        defaultNumberId = "themeTable"  
            
        u"""Если данная запись присутсвует в таблице"""
        if not numberSeries.tryGet(defaultNumberId):
            u"""Создаем запись в таблице numbersSeries"""
            numberSeries.id = defaultNumberId
            numberSeries.description = "Таблица %s" % (defaultNumberId) 
            
            u"""Создаем запись в таблице linesOfNumbersSeries"""
            linesOfNumbersSeries.seriesId = defaultNumberId
            linesOfNumbersSeries.numberOfLine = 1
            linesOfNumbersSeries.startingDate = dateFormat.parse(date)
            linesOfNumbersSeries.startingNumber = 1
            linesOfNumbersSeries.endingNumber = 100
            linesOfNumbersSeries.incrimentByNumber = 1
            
            u"""Добавляем записи в таблицы numbersSeries и linesOfNumbersSeries""" 
            numberSeries.insert()
            linesOfNumbersSeries.insert()
            
            u"""Закрываем курсоры numbersSeries и linesOfNumbersSeries"""
            numberSeries.close()
            linesOfNumbersSeries.close()
        
        u"""Записываем в поле ThemeID сгенерированный id"""
        theme.ThemeID = getNextNo.getNextNoOfSeries(context, defaultNumberId) 
                        
  
    elif add == "edit":
        currRecordId = idContent['currentRecordId']
        theme.get(currRecordId)
    
    u"""Проверка на запрещенные символы"""
    illegalInputSigns = checkIllegalSigns(content, context)
    
    if  not illegalInputSigns:
        u""" Внесение изменений в данные"""
        theme.ThemeName = content["@ThemeName"]
        theme.ParentTheme = content["@ParentTheme"]
        theme.PackageID = content["@PackageID"]
            
        u""" Обновление, удаление, и редактирование для соответсвующей карточки"""
        if add == "add":
            theme.insert()
        elif add == "edit":
            theme.update()

        context.message(u"Данные сохранены")

def checkIllegalSigns(content, context):
    result = False
    
    u"""Список запрещенных символов"""
    illegalSigns = ["{", "}"]
    
    u"""Словарь соотвествия названия поля ввода и столбца в таблице"""
    inputFieldsDict = {"@testSystemAddress": "Адрес системы тестирования",
                       "@link": "Ссылка"
                       }
    u"""Поиск запрещенных символов в введенных строках"""    
    for sign in illegalSigns:
        for key, value in content.items():
            if sign in value:
                context.error(u"Ошибка в поле \"%s\", символ %s запрещен. Список запрещенных символов: %s" % (inputFieldsDict[key], sign, illegalSigns))
         
    return result
