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

@author: Lopatin I.
'''
import json

from ru.curs.celesta.showcase.utils import XMLJSONConverter
from common.sysfunctions import toHexForXml
from common.sysfunctions import getGridHeight, getGridWidth
from author._author_orm import subscribedServiceCatalogCursor

try:
    from ru.curs.showcase.core.jython import JythonDTO
    from ru.curs.showcase.app.api import MessageType, UserMessage
except:
    from ru.curs.celesta.showcase import JythonDTO


def gridData(context, main=None, add=None, filterinfo=None,
             session=None, elementId=None, sortColumnList=None, firstrecord=None, pagesize=None):
    u'''Функция получения данных для грида. '''
    
    u"""Курсор таблицы serviceCatalog"""
    service = subscribedServiceCatalogCursor(context)
#     service.setFilter("link", "@%%'%s'%%" % (u"cur"))
    
    filterByCard(service, session)
    
    u"""Определение переменной для JSON-данных"""
    data = {"records":{"rec":[
                              ]}
            }
 
    u"""Заголовки для столбцов грида"""
    _headers = {'id': ["~~id"],
                'testSystemAddress': [u'Адрес подписанной системы'],
                'link': [u'Ссылка'],
                "properties": ["properties"]
                }
    u"""Событие определяющее тег action в элементе properties"""
    event = {"event":
                {"@name":"row_single_click",
                 "action":{
                    "#sorted": [
                        {"main_context": "current"},
                     {"datapanel":
                        {'@type':"current",
                         '@tab':"current"}
                    }]}
                 }
             }
        
    u"""Приведение названий столбцов к формату поддерживаемому XML файлами"""    
    for column in _headers:
        _headers[column].append(toHexForXml(_headers[column][0]))
                
    u"""Ограничение единовременно отображаемых данных в гриде""" 
    service.limit(firstrecord - 1, pagesize)
    
    u"""Получения данных из таблицы subscribedServiceCatalog для отображения их в гриде"""
    for service in service.iterate():
        services_dict = {}
        services_dict[_headers['id'][1]] = service.catalogId
        services_dict[_headers['testSystemAddress'][1]] = service.testSystemAddress
        services_dict[_headers['link'][1]] = service.link
        services_dict[_headers['properties'][1]] = event
                
        data["records"]["rec"].append(services_dict)
    
    u"""Конвертация JSON-данных в XML"""
    data = XMLJSONConverter.jsonToXml(json.dumps(data))
    
    return JythonDTO(data, None)


def gridMeta(context, main, add=None, filterinfo=None,
             session=None, elementId=None):
    u"""Функция получения параметров для грида"""
 
    u"""Курсор таблицы subscribedServiceCatalog"""
    service = subscribedServiceCatalogCursor(context)
 
    u"""Заголовки для столбцов грида"""
    _headers = {'id': ["~~id"],
                'testSystemAddress': [u'Адрес подписанной системы'],
                'link': [u'Ссылка'],
                "properties": ["properties"]
                }

    u"""Количество записей в таблице"""
    totalcount = service.count()
    
    u"""Настройки грида"""
    settings = {}
    settings["gridsettings"] = {"columns": {"col":[] },
                                "labels": {"header": u"Каталог подписанных систем"},
                                "properties": {"@gridHeight": getGridHeight(session, delta = 130),
#                                                "@gridWidth": getGridWidth(session),
                                               "@gridWidth": "100%",
                                               "@totalCount": totalcount,
                                               "@pagesize": "100"  # Максимальное количество отображаемых записей
                                               }
                                }
    settings["gridsettings"]["columns"]["col"].append({"@id":_headers["testSystemAddress"][0]})
    settings["gridsettings"]["columns"]["col"].append({"@id":_headers["link"][0]})
 
    return JythonDTO(None, XMLJSONConverter.jsonToXml(json.dumps(settings)))

def gridToolBar(context, main=None, add=None, filterinfo=None, session=None, elementId=None):
    u"""Функция отображения панели инструментов"""

    u"""Получение данных сессии"""
    session = json.loads(session)['sessioncontext']
    
    u"""Курсор таблицы subscribedServiceCatalog"""
    service = subscribedServiceCatalogCursor(context)
    
    u"""Переменная для задания стиля отображения кнопок"""
    style = "true"
    
    u"""Переменная для задания стиля отображения кнопок"""
    if 'currentRecordId' in session['related']['gridContext']:
        style = 'false'
        
    u"""Настройка toolbar"""
    data = {"gridtoolbar":{"item":[{"@img": 'gridToolBar/addDirectory.png',
                                    "@text":"Добавить",
                                    "@hint":"Добавить",
                                    "@disable": "false",
                                    "action":{"@show_in": "MODAL_WINDOW",
                                              "#sorted":[{"main_context":"current"},
                                                         {"modalwindow":{"@caption": "Добавление записи",
                                                                         "@height": "320",
                                                                         "@width": "440"
                                                                         }
                                                          },
                                                         {"datapanel":{"@type": "current",
                                                                       "@tab": "current",
                                                                       "element": {"@id": "subscribedServiceCatalogAddEditCard",
                                                                                   "add_context":"add"}
                                                                       }
                                                          }]
                                              }
                                    },
                                    {"@img": 'gridToolBar/editDocument.png',
                                     "@text":"Редактировать",
                                     "@hint":"Редактировать",
                                     "@disable": style,
                                     "action":{"@show_in": "MODAL_WINDOW",
                                               "#sorted":[{"main_context":"current"},
                                                          {"modalwindow":{"@caption": "Редактирование записи",
                                                                          "@height": "320",
                                                                          "@width": "440"
                                                                          }
                                                           },
                                                          {"datapanel":{"@type": "current",
                                                                        "@tab": "current",
                                                                        "element": {"@id": "subscribedServiceCatalogAddEditCard",
                                                                                    "add_context":"edit"}
                                                                        }
                                                           }]
                                               }
                                     },
                                    {"@img": 'gridToolBar/deleteDocument.png',
                                     "@text":"Удалить",
                                     "@hint":"Удалить",
                                     "@disable": style,
                                     "action":{"@show_in": "MODAL_WINDOW",
                                               "#sorted":[{"main_context":"current"},
                                                          {"modalwindow":{"@caption": "Удаление записи",
                                                                          "@height": "200",
                                                                          "@width": "450"
                                                                          }
                                                           },
                                                          {"datapanel":{"@type": "current",
                                                                        "@tab": "current",
                                                                        "element": {"@id": "subscribedServiceCatalogDeleteCard",
                                                                                    "add_context":"delete"}
                                                                        }
                                                           }]
                                               }
                                     }
                                   ]
                           }
            }    
    return XMLJSONConverter.jsonToXml(json.dumps(data))

def filterByCard(service, session):
    u"""Функция для фильтрации грида по данным введенным в карточку"""
    
    relatedData = json.loads(session)['sessioncontext']['related']
    u"""Дополнительные параметры, неучавствующие в фильтрации"""
    extraParameters = ["show", "add"]
    
    u"""Случай удачной загрузки данных"""
    if 'formData' in relatedData['xformsContext']:
        catalogData = relatedData['xformsContext']['formData']['schema']['catalogData']
        for key, value in catalogData.items():
            keyName = str(key[1:])
               
            u"""Исключение фильтрации по дополнительным параметрам"""
            if keyName not in extraParameters:
                service.setFilter(keyName, "@%%'%s'%%" % (value))
            else:
                pass
    else:
        pass
                 
         
