# coding: utf-8
u'''
Основной грид реестра ФЛ (медработников).

'''

from java.text import SimpleDateFormat
import json

from com.jayway.jsonpath import JsonPath
from common.sysfunctions import toHexForXml, getGridHeight
from nci._nci_orm import personCursor
from ru.curs.celesta.showcase.utils import XMLJSONConverter
from security.functions import userHasPermission
from nci.functions.persons import normalizeSnils, createAccount, changePassword,\
    getFRMRPersonData
from security._security_orm import subjectsCursor, loginsCursor


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, add=None, filterinfo=None, session=None, elementId=None,
             sortColumnList=None, firstrecord=None, pagesize=None):

    person = personCursor(context)
#     сортировка
    if sortColumnList:
        sortName = toHexForXml(sortColumnList[0].id)
        sortType = unicode(sortColumnList[0].sorting).lower()
    else:
        sortName = None
    # фильтрация
    externalFilter(person, main, session)
    person.orderBy('fullname')
    # Заголовки
    _header = {
        'uid': ['~~id'],
        'surname': [u'Фамилия'],
        'name': [u'Имя'],
        'patronymic': [u'Отчество'],
        'snils': [u'СНИЛС'],
        'email': [u'E-mail'],
        'birthDate': [u'Дата рождения'],
        'phone': [u'Телефон'],
        'phoneExtra': [u'Доп. телефон'],
        'in_frmr': [u'Наличие в ФРМР'],
        'properties': [u'properties']
    }
    for column in _header:
        _header[column].append(toHexForXml(_header[column][0]))
        if sortName == _header[column][1]:
            person.orderBy("%s %s" % (column, sortType))

    person.limit(firstrecord - 1, pagesize)

    grid_data = {
        'records': {
            'rec':[]
        }
    }

    event_base = {
            'event': {
                '@name': 'row_single_click',
                'action': {
                    '#sorted': [
                        {
                            'main_context': 'current'
                        },
                        {
                            'datapanel': {
                                '@type': 'current',
                                '@tab': 'current',
                                "element": {"@id": "personEduOrganizationGrid",
                                            "add_context": ""}
                            }
                        }
                    ]
                }
            }
        }


    for person in person.iterate():
        currentrow = {}
        currentrow[_header['uid'][1]] = person.uid
        currentrow[_header['in_frmr'][1]] = '%s.png' % str(person.in_frmr).lower()
        currentrow[_header['surname'][1]] = person.surname
        currentrow[_header['name'][1]] = person.name
        currentrow[_header['patronymic'][1]] = person.patronymic
        currentrow[_header['snils'][1]] = person.snils
        currentrow[_header['email'][1]] = person.email
        currentrow[_header['phone'][1]] = person.phone
        currentrow[_header['phoneExtra'][1]] = person.phoneExtra
        currentrow[_header['birthDate'][1]] = SimpleDateFormat("dd.MM.yyyy").format(person.birthDate) if person.birthDate else ""

        currentrow[_header['properties'][1]] = event_base
        grid_data['records']['rec'].append(currentrow)

    return JythonDTO(XMLJSONConverter.jsonToXml(json.dumps(grid_data)),
                     None)

def gridMeta(context, main=None, add=None, filterinfo=None, session=None, elementId=None,
             sortColumnList=None):

    person = personCursor(context)
    # фильтрация
    externalFilter(person, main, session)

    # Заголовки
    _header = {
        'uid': ['~~id'],
        'surname': [u'Фамилия'],
        'name': [u'Имя'],
        'patronymic': [u'Отчество'],
        'snils': [u'СНИЛС'],
        'email': [u'E-mail'],
        'birthDate': [u'Дата рождения'],
        'phone': [u'Телефон'],
        'phoneExtra': [u'Доп. телефон'],
        'in_frmr': [u'Наличие в ФРМР'],
        'properties': [u'properties']
    }
    
    # в зависимости от контекста разный хэдер
    if main == 'full':
        header_text = {'b':'Физические лица'}
    elif main == 'strict':
        header_text = {'b':'Физические лица. Чтобы отобразить записи о физических лицах заполните фильтр и нажмите Найти.'}
    else:
        header_text = {'b':'Физические лица'}

    grid_settings = {}
    grid_settings['gridsettings'] = {
        'labels': {
            'header': header_text
        },
        'columns': {
            'col': []
        },
        'properties': {
            '@pagesize': 50,
            '@gridWidth': '100%',
            '@gridHeight': getGridHeight(session, numberOfGrids=2, gridHeaderHeight=55, delta=59),
            '@totalCount': person.count(),
            '@profile': 'default.properties'
        },
    }
    # Добавляем поля для отображения в gridsettingss
    grid_settings['gridsettings']['columns']['col'].append({'@id': _header['in_frmr'][0],
                                                            '@type': 'IMAGE',
                                                            '@width': '50px'})
    grid_settings['gridsettings']['columns']['col'].append({'@id': _header['surname'][0]})
    grid_settings['gridsettings']['columns']['col'].append({'@id': _header['name'][0]})
    grid_settings['gridsettings']['columns']['col'].append({'@id': _header['patronymic'][0]})
    grid_settings['gridsettings']['columns']['col'].append({'@id': _header['birthDate'][0],
                                                            '@width': '60px'})
    grid_settings['gridsettings']['columns']['col'].append({'@id': _header['snils'][0],
                                                            '@width': '100px'})
    grid_settings['gridsettings']['columns']['col'].append({'@id': _header['email'][0],
                                                            '@width': '150px'})
    grid_settings['gridsettings']['columns']['col'].append({'@id': _header['phone'][0],
                                                            '@width': '100px'})
    grid_settings['gridsettings']['columns']['col'].append({'@id': _header['phoneExtra'][0],
                                                            '@width': '100px'})

    return JythonDTO(None,
                     XMLJSONConverter.jsonToXml(json.dumps(grid_settings)))

def gridToolBar(context, main=None, add=None, filterinfo=None, session=None, elementId=None):

    session_json = json.loads(session)['sessioncontext']
    grid_context = session_json['related']['gridContext']
    string_bool = lambda x: x and 'true' or 'false'

    # добавление ФЛ
    if userHasPermission(context, session_json['sid'], 'addPerson'):
        add_style = string_bool(False)
    else:
        add_style = string_bool(True)
    # редактирование ФЛ
    if userHasPermission(context, session_json['sid'], 'editPerson'):
        edit_style = (string_bool(False) if 'currentRecordId' in grid_context
                      else string_bool(True))
    else:
        edit_style = string_bool(True)
    # удаление ФЛ
    if userHasPermission(context, session_json['sid'], 'delPerson'):
        delete_style = edit_style
    else:
        delete_style = string_bool(True)
    # создание аккаунта ФЛ
    if userHasPermission(context, session_json['sid'], 'createPersonAccount'):
        account_style = (string_bool(False) if 'currentRecordId' in grid_context
                      else string_bool(True))
    else:
        account_style = string_bool(True)
    # смена пароля ФЛ
    if userHasPermission(context, session_json['sid'], 'changeAccountPassword'):
        pass_style = (string_bool(False) if 'currentRecordId' in grid_context
                      else string_bool(True))
    else:
        pass_style = string_bool(True)
        
    # проверка ФЛ в ФРМР
    if userHasPermission(context, session_json['sid'], 'checkPersonInFRMR'):
        check_frmr_style = (string_bool(False) if 'currentRecordId' in grid_context
                      else string_bool(True))
    else:
        check_frmr_style = string_bool(True)
            
    add_button = {
                    'item': {
                        '@text': u'Добавить',
                        '@hint': u'Добавить ФЛ',
                        '@disable': add_style,
                        'action': {
                            '@show_in': 'MODAL_WINDOW',
                            '#sorted': [
                                {
                                    'main_context': 'current'
                                },
                                {
                                    'modalwindow': {
                                        '@caption': u'Добавить запись о физическом лице',
                                        '@height': '500',
                                        '@width': '700'
                                    }
                                },
                                {
                                    'datapanel': {
                                        '@type': 'current',
                                        '@tab': 'current',
                                        'element': {
                                            '@id': 'personCard',
                                            'add_context': 'add'
                                        }
                                    }
                                }
                            ]
                        }
                    }
                }
    
    edit_button = {
                    'item': {
                        '@text': u'Редактировать',
                        '@hint': u'Редактировать ФЛ',
                        '@disable': edit_style,
                        'action': {
                            '@show_in': 'MODAL_WINDOW',
                            '#sorted': [
                                {
                                    'main_context': 'current'
                                },
                                {
                                    'modalwindow': {
                                        '@caption': u'Редактировать запись о физическом лице',
                                        '@height': '500',
                                        '@width': '700'
                                    }
                                },
                                {
                                    'datapanel': {
                                        '@type': 'current',
                                        '@tab': 'current',
                                        'element': {
                                            '@id': 'personCard',
                                            'add_context': 'edit'
                                        }
                                    }
                                }
                            ]
                        }
                    }
                }
    
    del_button = {
                    'item': {
                        '@text': u'Удалить',
                        '@hint': u'Удалить ФЛ',
                        '@disable': delete_style,
                        'action': {
                            '@show_in': 'MODAL_WINDOW',
                            '#sorted': [
                                {
                                    'main_context': 'current'
                                },
                                {
                                    'modalwindow': {
                                        '@caption': 'Удалить данные о физическом лице',
                                        '@height': '140',
                                        '@width': '400'
                                    }
                                },
                                {
                                    'datapanel': {
                                        '@type': 'current',
                                        '@tab': 'current',
                                        'element': {
                                            '@id': 'personDeleteCard',
                                            'add_context': ''
                                        }
                                    }
                                }
                            ]
                        }
                    }
                }
    
    account_button = {
                    'item': {
                        '@text': u'Создать аккаунт',
                        '@hint': u'Создать аккаунт для ФЛ',
                        '@disable': account_style,
                        'action': {
                            '#sorted': [
                                {
                                    'main_context': 'current'
                                },
                                {"server": {"activity": {"@id": "createAccount",
                                                         "@name": "nci.grid.personGrid.createPersonAccount.celesta",
                                                         "add_context": ""
                                                         }

                                            }
                                }
                            ]
                        }
                    }
                }
    
    pass_button = {
                    'item': {
                        '@text': u'Сменить пароль',
                        '@hint': u'Сменить пароль аккаунта данного ФЛ',
                        '@disable': pass_style,
                        'action': {
                            '#sorted': [
                                {
                                    'main_context': 'current'
                                },
                                {"server": {"activity": {"@id": "changePassword",
                                                         "@name": "nci.grid.personGrid.changePersonPassword.celesta",
                                                         "add_context": ""
                                                         }

                                            }
                                }
                            ]
                        }
                    }
                }
    
    check_frmr_button = {
                    'item': {
                        '@text': u'Проверить в ФРМР',
                        '@hint': u'Проверить в ФРМР',
                        '@disable': check_frmr_style,
                        'action': {
                            '#sorted': [
                                {
                                    'main_context': 'current'
                                },
                                {"server": {"activity": {"@id": "changePassword",
                                                         "@name": "nci.grid.personGrid.checkPersonInFRMR.celesta",
                                                         "add_context": ""
                                                         }

                                            }
                                }
                            ]
                        }
                    }
                }

    grid_toolbar = {
        'gridtoolbar': {
            '#sorted': []
        }
    }
    
    # добавляем кнопки
    grid_toolbar['gridtoolbar']['#sorted'].append(add_button)
    grid_toolbar['gridtoolbar']['#sorted'].append(edit_button)
    grid_toolbar['gridtoolbar']['#sorted'].append(del_button)
    grid_toolbar['gridtoolbar']['#sorted'].append(account_button)
    grid_toolbar['gridtoolbar']['#sorted'].append(pass_button)
    grid_toolbar['gridtoolbar']['#sorted'].append(check_frmr_button)

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

def createPersonAccount(context, main=None, add=None, filterinfo=None, session=None, person_id=None, login=None, password=None, show_message=True):
    u'''Создание аккаунта для ФЛ с проверкой существования аккаунта.'''    
    if not person_id:
        person_id = JsonPath.read(session, "$.sessioncontext.related.gridContext.currentRecordId")
    subjects = subjectsCursor(context)
    
    subjects.setRange('employeeId', person_id)
    message = u''
    if subjects.count() == 0:
        # можно создать
        createAccount(context, person_id, password, login, roles=['medstaff', 'address'])
        message = u'Аккаунт создан успешно.'
    else:
        # нельзя создать
        message = u'У данного ФЛ уже существует аккаунт!'
    
    if show_message:
        context.message(message)
        
    return message    
    

def changePersonPassword(context, main=None, add=None, filterinfo=None, session=None, password=None):
    u'''Смена пароля.'''

    person_id = JsonPath.read(session, "$.sessioncontext.related.gridContext.currentRecordId")
    changePassword(context, person_id, password)
    
    
def checkPersonInFRMR(context, main=None, add=None, filterinfo=None, session=None):
    u'''Проверка, есть ли данное ФЛ в ФРМР.'''

    person_id = JsonPath.read(session, "$.sessioncontext.related.gridContext.currentRecordId")
    person = personCursor(context)
    person.get(person_id)
    
    person_data = getFRMRPersonData(person.snils)
    
    if person_data and isinstance(person_data, dict) and 'Employee' in person_data:
        person.in_frmr = True
        person.update()
        context.message(u'Данное ФЛ найдено в ФРМР')
    elif person_data and isinstance(person_data, Exception):
        context.error(repr(person_data))
    else:
        context.message(u'Данное ФЛ не найдено в ФРМР')
     

def externalFilter(cursor, main, session):
    u'''Внешний фильтр. '''
    
    filter_data = JsonPath.read(session, "$.sessioncontext.related.xformsContext.formData.schema.record")
    
    if filter_data['surname']!='':
        cursor.setFilter('surname', "@%%'%s'%%" % filter_data['surname'])
    if filter_data['name']!='':
        cursor.setFilter('name', "@%%'%s'%%" % filter_data['name'])
    if filter_data['patronymic']!='':
        cursor.setFilter('patronymic', "@%%'%s'%%" % filter_data['patronymic'])
    if filter_data['birthDate']!='':
        cursor.setRange('birthDate', SimpleDateFormat("yyyy-MM-dd").parse(filter_data['birthDate']))
    if filter_data['email']!='':
        cursor.setFilter('email', "@'%s'" % filter_data['email'])
    if filter_data['phone']!='':
        cursor.setFilter('phone', "@%%'%s'%%" % filter_data['phone'])
    if filter_data['phoneExtra']!='':
        cursor.setFilter('phoneExtra', "@%%'%s'%%" % filter_data['phoneExtra'])
    if filter_data['sex']!='-':
        cursor.setRange('sex', filter_data['sex'])
    if filter_data['in_frmr']!='-':
        cursor.setRange('in_frmr', True if filter_data['in_frmr'] == 'true' else False)
    if filter_data['snils']!='':
        # преобразуем СНИЛС
        cursor.setRange('snils', normalizeSnils(filter_data['snils']))
    # обрабатываем main, в котором задается режим
    if main=='strict' and filter_data['snils']=='' and filter_data['surname']=='':
        cursor.setFilter('uid', "null")