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

@author: v.popov
'''

import simplejson as json
from common.dbutils import DataBaseXMLExchange
from java.io import FileOutputStream, FileInputStream, File, ByteArrayOutputStream, ByteArrayInputStream
from qt._qt_orm import QtiPackageCursor, QtiThemeCursor, \
    QtiPackageAttributeCursor, QtiQuestionCursor, QtiDestructorCursor, ContentCursor, Content_AttributeValueCursor
from zipfile import ZipFile

from java.io import FileInputStream
import os

# from catalogs._catalogs_orm import cycles_viewCursor, faculty_departmentCursor

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
    from ru.curs.showcase.app.api import UserMessage, MessageType
    from ru.curs.showcase.core.jython import JythonDownloadResult
except:
    from ru.curs.celesta.showcase import JythonDTO, ResultSelectorData, DataRecord, UserMessage, MessageType

from ru.curs.celesta.showcase.utils import XMLJSONConverter

def cardData(context, main=None, add=None, filterinfo=None, session=None, elementId=None):
    u'''Данные для карточки.'''
    
    package = QtiPackageCursor(context)
    session = json.loads(session)
    gridContext = session['sessioncontext']['related']['gridContext']
    
    if "currentRecordId" in gridContext:
        currentRecordId = gridContext["currentRecordId"]
        package.get(currentRecordId)

    btzName = package.PackageName
    # Структура данных
    xformsdata = {"schema":
                  {"context":
                   {"@id": "downloadBtz",
                    "@btzName": btzName,
                    }}}

    xformssettings = {"properties":{"event":{"@name":"single_click",
                                             "@linkId": "1",
                                             "action":{
                                                  "#sorted": [
                                                      {"main_context": "current"},
                                                      {"datapanel": {"@type": "current",
                                                                     "@tab": "current",
                                                                     "element": {"@id":"btzCatalogGrid",
                                                                                 "add_context": ""}
                                                                     }
                                                      }]}
                                             }
                                    }
                      }


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

def downloadBtzCard(context, main=None, add=None, filterInfo=None, session=None, elementId=None, xformsdata=None):
    u"""Функция выгрузки файлов БТЗ с сервера"""
    
    data_dict = json.loads(xformsdata)
    session = json.loads(session)
    gridContext = session['sessioncontext']['related']['gridContext']
    
    u"""Объявление курсоров"""
    package = QtiPackageCursor(context)
    theme = QtiThemeCursor(context)
    question = QtiQuestionCursor(context)
    packageAttr = QtiPackageAttributeCursor(context)
    destructor = QtiDestructorCursor(context)
    content = ContentCursor(context)
    contentAttr = Content_AttributeValueCursor(context)
    
    u"""Основа имен для скачиваемых файлов"""
    packageFileName = "Package"
    themeFileName = "Theme"
    questionFileName = "Question_ThemeID_"
    destructorFileName = "Destructor_QuestionID_"
    packageAttrFileName = "PackAttribute"
    contentFileName = "Content"
    contentAttrFileName = "ContAttribute_contentID_"
    
    u"""Вытягивание выделенной записи и получение ID пакета"""
    try:
        packageId = gridContext['currentRecordId']
    except:
        pass
    
    u"""Фильтрация курсоров по ID пакета"""
    package.setRange('PackageID', packageId)
    theme.setRange('PackageID', packageId)
    packageAttr.setRange('PackageID', packageId)
    content.setRange('PackageID', packageId)

    u"""Создание временного zip объекта"""
    result = ZipFile(os.path.dirname(os.path.abspath(__file__))+"/result.zip", "w") #сохранение архива в каталог данного скрипта
    
    u"""Скачивание данных из таблиц"""
    downloadFile(package, result, packageFileName)
    downloadFile(theme, result, themeFileName)
    downloadFile(packageAttr, result, packageAttrFileName)
    if content.count() > 0:
        downloadFile(content, result, contentFileName)
    
    u"""Счетчики для подсчета номера вопроса и деструктора"""
    destructorCount = 1
    questionCount = 1
    
    u"""Выбор вопросов соотвествующих заданной теме"""
    for theme in theme.iterate():
        themeId = theme.ThemeID
        question.setRange("ThemeID", themeId)
        
        u"""Выбор деструкторов соотвествующих заданному вопросу"""
        for question in question.iterate():
            questionId = question.QuestionID
            destructor.setRange("QuestionID", questionId)
            u"""Загрузка данных из таблицы деструктор"""
            downloadFile(destructor, result, destructorFileName + str(destructorCount))
            destructorCount += 1
        
        u"""Загрузка данных из таблицы вопросы"""
        downloadFile(question, result, questionFileName + str(questionCount))
        questionCount += 1
    
    contentAttrCount = 1
    
    u"""Выбор значение контента по ID контента"""
    for content in content.iterate():
        contentId = content.ContentID
        contentAttr.setRange("ContentID", contentId)
        downloadFile(contentAttr, result, contentAttrFileName + str(contentAttrCount))    
        contentAttrCount += 1
    
    result.close()
    
    u"""Создание входного потока данных"""
    report = FileInputStream(os.path.dirname(os.path.abspath(__file__))+"/result.zip") #загрузка архива из каталог данного скрипта
    
    u"""Возврат переконвертированного файла""" 
    return JythonDownloadResult(report, u'%s.zip' % (data_dict['schema']['context']['@btzName']))
    # return JythonDownloadResult(FileInputStream('C:\\Lopatin_Ilya\\nav_setting_workable.txt'), u'%s' % (data_dict['schema']['context']['@btzName']))

def downloadFile(cursor, zipFile, fileName):
    u"""Функция записи файла в архив"""
    
    u"""Установка расширения для файла"""
    fileName += ".xml"
    
    u"""Создание потока вывода и перевод данных из файла в xml формат""" 
    dataStream = ByteArrayOutputStream()
    exchange = DataBaseXMLExchange(dataStream, cursor)
    
    u"""Запись данных в поток вывода / закрытие потока""" 
    exchange.downloadXML()
    dataStream.close()
    
    u"""Запись файла в архив"""
    zipFile.writestr(fileName, dataStream.toByteArray())

def cardDataSave(context, main=None, add=None, filterinfo=None, session=None, elementId=None, xformsdata=None):
    session = json.loads(session)['sessioncontext']
