# coding: utf-8
u'''
Основной грид реестра тем по курсам.

'''

from java.text import SimpleDateFormat
import json

from common.sysfunctions import toHexForXml, getGridHeight
from edu._edu_orm import vw_course_cycleCursor, cycle_edu_baseCursor, course_cycleCursor, courseCursor
from nci._nci_orm import person_edu_organizationCursor, education_formCursor, education_baseCursor, status_listCursor
from ru.curs.celesta.showcase.utils import XMLJSONConverter
from security.functions import userHasPermission
from com.jayway.jsonpath import JsonPath
from nci.functions.persons import getPersonIdBySid
from java.sql import Timestamp
from gridsettings.functions.gridSettings import toolbar_button_default, toolbar_button, filter_button, filter_reset_button, get_column_meta, get_column_data, get_column_header
from gridsettings._gridsettings_orm import grid_fieldCursor, \
    user_grid_fieldCursor


try:
    from ru.curs.showcase.core.jython import JythonDTO
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):
    sid = JsonPath.read(session, "$.sessioncontext.sid")
    course_cycle = vw_course_cycleCursor(context)
    status_list = status_listCursor(context)
#     edu_formCursor = education_formCursor(context)
    cycle_edu_base = cycle_edu_baseCursor(context)
    edu_base = education_baseCursor(context)
    grid_field = grid_fieldCursor(context)
    user_grid_field = user_grid_fieldCursor(context)
        
    session = json.loads(session)


    u"""ID выделенного курса"""
#     currentId = session["sessioncontext"]["related"]["gridContext"]["currentRecordId"]
    currentId = main
    course_cycle.setRange("course_id", currentId)
    
    if sortColumnList:
        sortName = toHexForXml(sortColumnList[0].id)
        sortType = unicode(sortColumnList[0].sorting).lower()
    else:
        sortName = None

    course_cycle.orderBy('cycle_order', 'note')
    
    if not userHasPermission(context, sid, "allEduOrgCourse"):
#         hasPermission = "false"
        person_org = person_edu_organizationCursor(context)
        person_org.setRange("person_id", getPersonIdBySid(context, sid))
        if not person_org.count():
            context.error(u"Обратитесь к администратору для приписывания к образовательной организации")
        edu_list = []
        for person_org in person_org.iterate():
            edu_list.append("'%s'" % person_org.edu_organization_id)
        course_cycle.setFilter("edu_organization_id", "|".join(edu_list))
    else:
#         hasPermission = "true"
        course_cycle.setFilter('status_id','1|3|4|5|6')


#     if context.getData().get('courseCycleFilter',''):
#         filter_string = ext_filter(context.getData['courseCycleFilter'],course_cycle,context)

    # Заголовки
    _header = {
        'uid': ['~~id', 'uid'],
        'properties': [u'properties', 'properties']
    }

    _header.update(get_column_header(grid_field,user_grid_field,elementId,sid))
    
    for column in _header:
        _header[column].append(toHexForXml(_header[column][0]))
        if column != "edu_form" and column != "edu_base":
            if sortName == _header[column][-1]:
                course_cycle.orderBy("%s %s" % (column, sortType))

#     course_cycle.limit(firstrecord - 1, pagesize)

    grid_data = {'records': {'rec': []}}
#     df = SimpleDateFormat("dd.MM.yyyy")
    for course_cycle in course_cycle.iterate():
        u"""Получение формы и статуса обучения"""
#         edu_formCursor.get(course_cycle.education_form_id)
        status_list.get(course_cycle.status_id)
        
        u"""Название основы обучения"""
        edu_base_name = ""
        u"""Получение названия основы обучения"""
        cycle_edu_base.setRange("cycle_id",course_cycle.uid)
        for base in cycle_edu_base.iterate():
            edu_base.get(base.edu_base_id)
            edu_base_name += edu_base.name + ", "
        edu_base_name = edu_base_name[:-2]#отсечение последней запятой и пробела

        add_info = {"base": edu_base_name}
    
        row = {}
        row[_header['uid'][2]] = course_cycle.uid
        get_column_data(_header, grid_field, user_grid_field, elementId, sid, course_cycle, row,**add_info)
#         if course_cycle.start_date:
#             row[_header['start_date'][1]] = df.format(course_cycle.start_date)
#         if course_cycle.end_date:
#             row[_header['end_date'][1]] = df.format(course_cycle.end_date)
#         row[_header['edu_form'][1]] = edu_formCursor.name
#         row[_header['edu_base'][1]] = edu_base_name
#         row[_header['clinic_base'][1]] = course_cycle.clinic_base
#         row[_header['budget_places'][1]] = int(course_cycle.budget_places)
#         row[_header['paid_places'][1]] = int(course_cycle.paid_places)
#         row[_header['outside'][1]] = u'Да' if course_cycle.outside else u'Нет'     
#         row[_header['status_name'][1]] = status_list.name
#         row[_header['dot_and_eo'][1]] = u'Да' if course_cycle.dot_and_eo else u'Нет' #{"div": {"#text": "ddd",
#                                                  #"@align": "center",
#                                                 #"@title": ""
#                                                 # } 
#                                          #}
#         row[_header['note'][1]] = course_cycle.note 

#         row[_header['properties'][2]] = {
#             'event': {
#                 '@name': 'row_single_click',
#                 'action': {
#                     '#sorted': [
#                         {'main_context': 'current'}]}}}
        if course_cycle.dot_and_eo:
            row[_header['properties'][2]] = {'event': {
                                                '@name': 'row_single_click',
                                                'action': {
                                                    '#sorted': [
                                                        {'main_context': 'current'},
                                                        {'datapanel': {
                                                            '@type': 'current',
                                                            '@tab': 'current',
                                                            "element": [ 
                                                                {"@id": "courseCycleQtiPackageGrid",
                                                                 "add_context": ''}]}}]}}}
            
        grid_data['records']['rec'].append(row)

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


def gridMeta(context, main=None, add=None, filterinfo=None, session=None, elementId=None):
    session = json.loads(session)
    sid = session["sessioncontext"]["sid"]

    course_cycle = vw_course_cycleCursor(context)
    currentId = main
    course_cycle.setRange("course_id", currentId)

    if not userHasPermission(context, sid, "allEduOrgCourse"):
        person_org = person_edu_organizationCursor(context)
        person_org.setRange("person_id", getPersonIdBySid(context, sid))
        if not person_org.count():
            context.error(u"Обратитесь к администратору для приписывания к образовательной организации")
        edu_list = []
        for person_org in person_org.iterate():
            edu_list.append("'%s'" % person_org.edu_organization_id)
        course_cycle.setFilter("edu_organization_id", "|".join(edu_list))
    else:
        course_cycle.setFilter('status_id','1|3|4|5|6')
    filter_string = ''  
    if context.getData().get('courseCycleFilter',''):
        filter_string = ext_filter(context.getData['courseCycleFilter'],course_cycle,context)
    
    grid_settings = {}
    grid_settings['gridsettings'] = {
#         'labels': {
#             'header': u'Темы '+filter_string},
        'columns': {
            'col': get_column_meta(context,elementId,sid)},
        'properties': {
            '@pagesize': 10,
            '@gridWidth': '100%',
            '@gridHeight': getGridHeight(session, numberOfGrids=1, gridHeaderHeight=35),
            '@totalCount': course_cycle.count(),
            '@profile': 'default_excel.properties'}}
    
    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']
    sid = session_json['sid']
    grid_context = session_json['related']['gridContext']
    string_bool = lambda x: x and 'true' or 'false'
    course_cycle = course_cycleCursor(context)
    course = courseCursor(context)
    currentCourseId = main
    course.get(currentCourseId)
    
    u"""Выбор записи в гриде"""
    try:
        current_id = grid_context['currentRecordId']
    except:
        current_id = None
        
    recordChosen = current_id is not None
        

    u"""Дизактивация кнопок. Для активации кнопок,
    необходимо, чтобы статус программы был 'Утвежден(-а)'"""       
    edit_style = 'true'
    delete_style = 'true'
    change_style = 'true'
    add_style = 'true'
    
    u"""Если программа утрвеждена, разрешить модификации циклов"""
    if course.status_id == 3:
        add_style = 'false'
        # добавление курса
        if recordChosen and course_cycle.tryGet(current_id):
            if userHasPermission(context, session_json['sid'], 'allEduOrgCourse'):
                if course_cycle.status_id == 4:#если тема не формируется и не на доработке, то методист может редактировать и менять статус
                    edit_style = 'false'
                    change_style = 'false'
                elif course_cycle.status_id == 3 or course_cycle.status_id == 6:
                    change_style = 'false'
                if userHasPermission(context,session_json['sid'], 'cycleDelete'):
                    delete_style = 'false'
                    edit_style = 'false'
                    change_style = 'false'
            else:
                if course_cycle.status_id == 0:#тема формируется, обр. орг. может редактировать, удалять и менять статус
                    edit_style = 'false'
                    delete_style = 'false'
                    change_style = 'false'
                elif course_cycle.status_id == 1:#тема на доработке, обр. орг. может редактировать и менять статус 
                    edit_style = 'false'
                    change_style = 'false'
                #В стальных случаях кнопки заблокированы

    grid_toolbar = {
        'gridtoolbar': {
            '#sorted': [
                toolbar_button(context, sid, elementId),
                toolbar_button_default(context, sid, elementId),
                filter_button("courseCycleFilter",270,630),
                filter_reset_button("courseCycleGrid","courseCycleFilter"),                                 
                {'item': {
                    '@text': u'Добавить',
                    '@hint': u'Добавить тему',
                    '@disable': add_style,
                    'action': {
                        '@show_in': 'MODAL_WINDOW',
                        '#sorted': [
                            {'main_context': 'current'},
                            {'modalwindow': {
                                '@caption': u'Добавить тему',
                                '@height': '780',
                                '@width': '660'}},
                            {'datapanel': {
                                '@type': 'current',
                                '@tab': 'current',
                                'element': {
                                    '@id': 'courseCycleCard',
                                    'add_context': 'add'
                                    }}}]}}},
                {'item': {
                    '@text': u'Редактировать',
                    '@hint': u'Редактировать тему',
                    '@disable': edit_style,
                    'action': {
                        '@show_in': 'MODAL_WINDOW',
                        '#sorted': [
                            {'main_context': 'current'},
                            {'modalwindow': {
                                '@caption': u'Редактировать тему',
                                '@height': '780',
                                '@width': '660'}},
                            {'datapanel': {
                                '@type': 'current',
                                '@tab': 'current',
                                'element': {
                                    '@id': 'courseCycleCard',
                                    'add_context': 'edit'}}}]}}},
                {'item': {
                    '@text': u'Удалить',
                    '@hint': u'Удалить тему',
                    '@disable': delete_style,
                    'action': {
                        '@show_in': 'MODAL_WINDOW',
                        '#sorted': [
                            {'main_context': 'current'},
                            {'modalwindow': {
                                '@caption': u'Удалить тему',
                                '@height': '145',
                                '@width': '400'}},
                            {'datapanel': {
                                '@type': 'current',
                                '@tab': 'current',
                                'element': {
                                    '@id': 'courseCycleDeleteCard',
                                    'add_context': ''}}}]}}},
                {'item': {
                    '@text': u'Изменить статус',
                    '@hint': u'Изменить статус',
                    '@disable': change_style,
                    'action': {
                        '@show_in': 'MODAL_WINDOW',
                        '#sorted': [
                            {'main_context': 'current'},
                            {'modalwindow': {
                                '@caption': u'Изменение статуса',
                                '@height': '200',
                                '@width': '500'}},
                            {'datapanel': {
                                '@type': 'current',
                                '@tab': 'current',
                                'element': {
                                    '@id': 'courseCycleChangeStatusCard',
                                    'add_context': ''}}}]}}}]}}

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


def ext_filter(session,course_cycle, context):
    sdf = SimpleDateFormat('dd.MM.yyyy')
    status_list =  status_listCursor(context)
    filter_string = u"Фильтр: "
    filter_list = []
    whereclause = '1 = 1'
    def str2bool(str):
        if str == 'false':
            return False
        elif str == 'true':
            return True
        else:
            return False
    
    if True:#'formData' in session['related']['xformsContext']:
        data = session['schema']['record']
        
        status = data["status"]
        fromDate = data["fromDate"]
        toDate = data["toDate"]
        outside = data["outside"]
        
        if status != '-':
            status_list.get(int(status))
            filter_list.append(u'статус: %s'%(status_list.name))
            course_cycle.setRange("status_id",int(status))
        
        if fromDate != '':
            fromDate = Timestamp.valueOf(u'%s 00:00:00.0' % fromDate)
        if toDate != '':            
            toDate = Timestamp.valueOf(u'%s 23:59:59.0' % toDate)
        if fromDate != '' and toDate != '':
            filter_list.append(u"дата начала с %s по %s"%(sdf.format(fromDate),sdf.format(toDate)))
            course_cycle.setRange('start_date',fromDate,toDate)
        elif fromDate != '' and toDate == '':
            filter_list.append(u"дата начала с %s"%sdf.format(fromDate))
            whereclause += " and start_date >= '%s'"%(fromDate)
        elif fromDate == '' and toDate != '':
            filter_list.append(u"дата начала по %s"%sdf.format(toDate))
            whereclause += " and start_date <= '%s'"%(toDate)
        
        if outside != '-':
            filter_list.append(u"выездной: %s"%(u'Да' if str2bool(outside) else u'Нет'))
            course_cycle.setRange('outside',str2bool(outside))
                  
    course_cycle.setComplexFilter(whereclause)
    filter_string = '<b>' + filter_string + ','.join(filter_list) +'</b>'
    return filter_string