# coding: utf-8

import json

from common.sysfunctions import toHexForXml, getGridHeight
from ru.curs.celesta.showcase.utils import XMLJSONConverter
from security._security_orm import customPermsCursor


try:
    from ru.curs.showcase.core.jython import JythonDTO
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'''Функция получения данных для грида. '''
    # Создание экземпляра курсора разрешения
    permissions = customPermsCursor(context)
    if sortColumnList:
        sortName = toHexForXml(sortColumnList[0].id)
        sortType = unicode(sortColumnList[0].sorting).lower()
    else:
        sortName = None

    if 'formData' in session:
        typeId = json.loads(session)['sessioncontext']['related']['xformsContext'][
            'formData']['schema']['permission']['@type']
        if typeId:
            permissions.setRange('type', typeId)

    permissions.orderBy('name')

    # Определяем переменную для JSON данных
    data = {"records": {"rec": []}}
    # Проходим по таблице и заполняем data
    _header = {"id": ["~~id"],
               "name": [u"Разрешение"],
               "description": [u"Описание"],
               "type": [u"Тип"],

               "properties": [u"properties"]
               }
    for column in _header:
        _header[column].append(toHexForXml(_header[column][0]))
        if sortName == _header[column][1]:
            permissions.orderBy("%s %s" % (column, sortType))
    permissions.limit(firstrecord - 1, pagesize)
    for permissions in permissions.iterate():
        permDict = {}
        permDict[_header["id"][1]] = permissions.name
        permDict[_header["name"][1]] = permissions.name or ''
        permDict[_header["description"][1]] = permissions.description or ''
        permDict[_header["type"][1]] = permissions.type or ''

        permDict['properties'] = {"event": {"@name": "row_single_click",
                                            "action": {"#sorted": [{"main_context": 'current'},
                                                                   {"datapanel": {'@type': "current",
                                                                                  '@tab': "current",
                                                                                  "element": {"@id": "rolesCustomPermissionsGrid"}
                                                                                  }
                                                                    }]
                                                       }
                                            }
                                  }
        data["records"]["rec"].append(permDict)

    res = XMLJSONConverter.jsonToXml(json.dumps(data))
    return JythonDTO(res, None)


def gridMeta(context, main=None, add=None, filterinfo=None, session=None, elementId=None):
    u'''Функция получения настроек грида. '''

    # Курсор таблицы permissions
    permissions = customPermsCursor(context)
    # Вычисляем количества записей в таблице
    totalcount = permissions.count()
    # Заголовок таблицы
    header = "Разрешения"

    _header = {"id": ["~~id"],
               "name": [u"Разрешение"],
               "description": [u"Описание"],
               "type": [u"Тип"],

               "properties": [u"properties"]
               }
    # Определяем список полей таблицы для отображения
    settings = {}
    settings["gridsettings"] = {"columns": {"col": []},
                                "properties": {"@pagesize": "50",
                                               "@gridWidth": "100%",
                                               "@gridHeight": getGridHeight(session, 2.1, 60, 67),
                                               "@totalCount": totalcount,
                                               "@profile": "default.properties"},
                                "labels": {"header": header}
                                }
    # Добавляем поля для отображения в gridsettings
    settings["gridsettings"]["columns"]["col"].append({"@id": _header["name"][0],
                                                       "@width": "120px"})
    settings["gridsettings"]["columns"]["col"].append({"@id": _header["description"][0],
                                                       "@width": "240px"})
    settings["gridsettings"]["columns"]["col"].append({"@id": _header["type"][0],
                                                       "@width": "120px"})
    res = XMLJSONConverter.jsonToXml(json.dumps(settings))
    return JythonDTO(None, res)


def gridToolBar(context, main=None, add=None, filterinfo=None, session=None, elementId=None):
    u'''Toolbar для грида. '''

    if 'currentRecordId' not in json.loads(session)['sessioncontext']['related']['gridContext']:
        style = "true"
    else:
        style = "false"

    data = {"gridtoolbar": {"item": []
                            }
            }
    # Курсор таблицы permissions
    permissions = customPermsCursor(context)

    if permissions.canInsert():
        data["gridtoolbar"]["item"].append({"@img": 'gridToolBar/addDirectory.png',
                                            "@text": "Добавить",
                                            "@hint": "Добавить",
                                            "@disable": "false",
                                            "action": {"@show_in": "MODAL_WINDOW",
                                                       "#sorted": [{"main_context": "current"},
                                                                   {"modalwindow": {"@caption": "Добавление типа разрешения",
                                                                                    "@height": "400",
                                                                                    "@width": "500"}
                                                                    },
                                                                   {"datapanel": {"@type": "current",
                                                                                  "@tab": "current",
                                                                                  "element": {"@id": "customPermissionsXforms",
                                                                                              "add_context": "add"}
                                                                                  }
                                                                    }]
                                                       }
                                            })
    if permissions.canModify():
        data["gridtoolbar"]["item"].append({"@img": 'gridToolBar/editDocument.png',
                                            "@text": "Редактировать",
                                            "@hint": "Редактировать",
                                            "@disable": style,
                                            "action": {"@show_in": "MODAL_WINDOW",
                                                       "#sorted": [{"main_context": "current"},
                                                                   {"modalwindow": {"@caption": "Редактирование типа разрешения",
                                                                                    "@height": "400",
                                                                                    "@width": "500"}
                                                                    },
                                                                   {"datapanel": {"@type": "current",
                                                                                  "@tab": "current",
                                                                                  "element": {"@id": "customPermissionsXforms",
                                                                                              "add_context": "edit"}
                                                                                  }
                                                                    }]
                                                       }
                                            })
    if permissions.canDelete():
        data["gridtoolbar"]["item"].append({"@img": 'gridToolBar/deleteDocument.png',
                                            "@text": "Удалить",
                                            "@hint": "Удалить",
                                            "@disable": style,
                                            "action": {"@show_in": "MODAL_WINDOW",
                                                       "#sorted": [{"main_context": "current"},
                                                                   {"modalwindow": {"@caption": "Удаление типа разрешения",
                                                                                    "@height": "300",
                                                                                    "@width": "450"}
                                                                    },
                                                                   {"datapanel": {"@type": "current",
                                                                                  "@tab": "current",
                                                                                  "element": {"@id": "customPermissionsXformDelete",
                                                                                              "add_context": "delete"}
                                                                                  }
                                                                    }]
                                                       }
                                            })
    data["gridtoolbar"]["item"].append({"@img": 'gridToolBar/arrowDown.png',
                                        "@text": "Скачать",
                                        "@hint": "Скачать прочие разрешения в xml",
                                        "@disable": "false",
                                        "action": {"@show_in": "MODAL_WINDOW",
                                                   "#sorted": [{"main_context": "current"},
                                                               {"modalwindow": {"@caption": "Скачать разрешения",
                                                                                "@height": "300",
                                                                                "@width": "450"}
                                                                },
                                                               {"datapanel": {"@type": "current",
                                                                              "@tab": "current",
                                                                              "element": {"@id": "customPermissionsDownloadXform",
                                                                                          "add_context": "download"}
                                                                              }
                                                                }]
                                                   }
                                        }
                                       )
    data["gridtoolbar"]["item"].append({"@img": 'gridToolBar/arrowUp.png',
                                        "@text": "Загрузить",
                                        "@hint": "Загрузить прочие разрешения из xml",
                                        "@disable": "false",
                                        "action": {"@show_in": "MODAL_WINDOW",
                                                   "#sorted": [{"main_context": "current"},
                                                               {"modalwindow": {"@caption": "Загрузить разрешения",
                                                                                "@height": "300",
                                                                                "@width": "450"}
                                                                },
                                                               {"datapanel": {"@type": "current",
                                                                              "@tab": "current",
                                                                              "element": {"@id": "customPermissionsUploadXform",
                                                                                          "add_context": "upload"}
                                                                              }
                                                                }]
                                                   }
                                        }
                                       )

    return XMLJSONConverter.jsonToXml(json.dumps(data))