# coding: utf-8

import json

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


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'''Функция получения данных для грида. '''
    # Создание экземпляра курсора разрешения
    subjects = subjectsCursor(context)
    # Параметры сортировки
    if sortColumnList:
        sortName = toHexForXml(sortColumnList[0].id)
        sortType = unicode(sortColumnList[0].sorting).lower()
    else:
        sortName = None

    # Определяем переменную для JSON данных
    data = {"records":{"rec":[]}}
    # Определяем заголовки
    _header = {"rowid": ["~~id"],
               "sid": [u"SID"],
               "name": [u"Имя"],

               "properties": [u"properties"]
               }
    for column in _header:
        _header[column].append(toHexForXml(_header[column][0]))
        if sortName == _header[column][1]:
            subjects.orderBy("%s %s" % (column, sortType))

    subjects.limit(firstrecord - 1, pagesize)
    # Проходим по таблице и заполняем data
    for subjects in subjects.iterate():
        subjectsDict = {}
        subjectsDict[_header["rowid"][1]] = subjects.sid
        for column in [x for x in _header.keys() if x not in ("rowid", "properties")]:
            subjectsDict[_header[column][1]] = getattr(subjects, column) or ''
        subjectsDict['properties'] = {"event":{"@name":"row_single_click",
                                                "action":{"#sorted":[{"main_context": 'current'},
                                                                     {"datapanel":{'@type':"current",
                                                                                   '@tab':"current"}
                                                                      }]
                                                          }
                                                }
                                       }
        data["records"]["rec"].append(subjectsDict)


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

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

    subjects = subjectsCursor(context)
    # Вычисляем количества записей в таблице
    totalcount = subjects.count()
    # Заголовок таблицы
    header = "Субъекты"

    sec_settings = Settings()
    _header = {"rowid": ["~~id"],
               "sid": [u"SID"],
               "name": [u"Имя"],

               "properties": [u"properties"]
               }

    # Определяем список полей таблицы для отображения
    settings = {}
    currentDatapanelHeight = int(json.loads(session)["sessioncontext"]["currentDatapanelHeight"])
    if sec_settings.loginIsSubject():
        number =1
    else:
        # Вычисляем numberOfGrids, где 2.0 - numberOfGrids для первого грида users.py из датапанели
        # 59 - gridHeaderHeight для обоих гридов, 80 - суммарная дельта
        number = ((currentDatapanelHeight-59)*2.0)/(2.0*currentDatapanelHeight-2.0*80-currentDatapanelHeight+59)
    settings["gridsettings"] = {"columns": {"col": []},
                                "properties":{"@pagesize": "25",
                                              "@gridWidth": "100%",
                                              "@gridHeight": getGridHeight(session,
                                                                           number, delta = 40),
                                              "@totalCount": totalcount,
                                              "@profile": "default.properties"},
                                "labels":{"header":header}
                                }
    # Добавляем поля для отображения в gridsettings
    settings["gridsettings"]["columns"]["col"].append({"@id": _header["sid"][0],
                                                       "@width": "240px"})
    settings["gridsettings"]["columns"]["col"].append({"@id": _header["name"][0],
                                                       "@width": "240px"})

    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 для грида. '''

    settings = Settings()

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

    # raise Exception(session)

    data = {"gridtoolbar":{"item":[]}}
    if not settings.isEmployees():
        data["gridtoolbar"]["item"].append({"@img": 'gridToolBar/addDirectory.png',
                                            "@text":"Добавить",
                                            "@hint":"Добавить субъект",
                                            "@disable": "false",
                                            "action":{"@show_in": "MODAL_WINDOW",
                                                      "#sorted":[{"main_context":"current"},
                                                                 {"modalwindow":{"@caption": "Добавление субъекта",
                                                                                 "@height": "300",
                                                                                 "@width": "450"}
                                                                  },
                                                                 {"datapanel":{"@type": "current",
                                                                               "@tab": "current",
                                                                               "element": {"@id": "subjectsXform",
                                                                                           "add_context":"add"}
                                                                               }
                                                                  }]
                                                      }
                                            })
        data["gridtoolbar"]["item"].append({"@img": 'gridToolBar/editDocument.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": "subjectsXform",
                                                                                           "add_context":"edit"}
                                                                               }
                                                                  }]
                                                      }
                                            })
        data["gridtoolbar"]["item"].append({"@img": 'gridToolBar/deleteDocument.png',
                                            "@text":"Удалить",
                                            "@hint":"Удалить субъект",
                                            "@disable": style,
                                            "action":{"@show_in": "MODAL_WINDOW",
                                                      "#sorted":[{"main_context":"current"},
                                                                 {"modalwindow":{"@caption": "Удаление субъекта",
                                                                                 "@height": "150",
                                                                                 "@width": "450"}
                                                                  },
                                                                 {"datapanel":{"@type": "current",
                                                                               "@tab": "current",
                                                                               "element": {"@id": "subjectsXformDelete",
                                                                                           "add_context":"delete"}
                                                                               }
                                                                  }]
                                                      }
                                            })
    data["gridtoolbar"]["item"].append({"@img": 'gridToolBar/addDirectory.png',
                                        "@text":"Добавить роли",
                                        "@hint":"Добавить роли",
                                        "@disable": style,
                                        "action":{"@show_in": "MODAL_WINDOW",
                                                  "#sorted":[{"main_context":"current"},
                                                             {"modalwindow":{"@caption": "Добавление ролей",
                                                                             "@height": "350",
                                                                             "@width": "500"}
                                                              },
                                                             {"datapanel":{"@type": "current",
                                                                           "@tab": "current",
                                                                           "element": {"@id": "subjectsRolesXform",
                                                                                       "add_context":""}
                                                                           }
                                                              }]
                                                  }
                                        })
    return XMLJSONConverter.jsonToXml(json.dumps(data))