# coding: utf-8

from java.util import ArrayList
import json

from nci._nci_orm import edu_organizationCursor, org_addressCursor, person_edu_organizationCursor, org_activity_kindCursor
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


try:
    from ru.curs.showcase.core.selector import ResultSelectorData
    from ru.beta2.extra.gwt.ui.selector.api import DataRecord
except:
    pass


def procListAndCount(context, main=None, add=None, filterinfo=None, session=None, params=None,
                     curValue=None, startsWith=None, firstRecord=None, recordCount=None):
    '''ListAndCount для edu_organization'''
    
    org_activity_kind = org_activity_kindCursor(context)
    edu_organization = edu_organizationCursor(context)
    edu_organization.orderBy('name')
    edu_organization.setFilter('name', "@%s'%s'%%" % ("%"*(not startsWith), curValue))
    edu_organization.limit(firstRecord, recordCount)

    org_set = set()
#     org_activity_kind.setFilter('kind_id','4|5')
#     for org in org_activity_kind.iterate():
#         org_set.add(org.org_id)
#     if org_set:
#         edu_organization.setFilter('uid',"|".join(["'%s'"%id for id in org_set]))
#     else:
#         edu_organization.setRange('uid','0')
    count = edu_organization.count()

    recordList = ArrayList()
    for row in edu_organization.iterate():
        record = DataRecord()
        record.id = str(row.uid)
        record.name = row.shortname
        recordList.add(record)

    return ResultSelectorData(recordList, count)


def eduList(context, main=None, add=None, filterinfo=None, session=None, params=None,
            curValue=None, startsWith=None, firstRecord=None, recordCount=None):
    '''Список организаций'''
    sid = JsonPath.read(session, "$.sessioncontext.sid")
    org_address = org_addressCursor(context)
    edu_organization = edu_organizationCursor(context)
    org_activity_kind = org_activity_kindCursor(context)
    recordList = ArrayList()

    if params:
        filter_data = json.loads(XMLJSONConverter.xmlToJson(params))["schema"]["filter"]

        if not isinstance(filter_data, list):
            filter_data = [filter_data]

        for filter_item in filter_data:

            if filter_item.get("region_id"):
                org_address.setRange("region_id", filter_item["region_id"])
            elif filter_item.get("city_id"):
                org_address.setRange("city_id", filter_item["city_id"])

    address_list = []
    for org_address in org_address.iterate():
        address_list.append("'%s'" % org_address.address_id)

    if address_list:
        edu_organization.setFilter("address_id", "|".join(address_list))

    # доп. проверка, вообще в селектор пользователь не должен попадать, если нет разрешения
    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)
            edu_organization.setFilter("uid", "|".join(edu_list))
#     else:
#         org_set = set()
# #         org_activity_kind.setFilter('kind_id','4|5')
#         for org in org_activity_kind.iterate():
#             org_set.add(org.org_id)
#         if org_set:
#             edu_organization.setFilter('uid',"|".join(["'%s'"%id for id in org_set]))
#         else:
#             edu_organization.setRange('uid','0')
    if not edu_organization.count():
        context.error(u"Нет доступных образовательных учреждений")
    edu_organization.orderBy('name')
    edu_organization.setFilter('name', "@%s'%s'%%" % ("%"*(not startsWith), curValue))
    edu_organization.limit(firstRecord, recordCount)

    for edu_organization in edu_organization.iterate():

        record = DataRecord()
        record.id = str(edu_organization.uid)
        record.name = edu_organization.shortname

        if edu_organization.address_id:
            org_address.get(edu_organization.address_id)

            record.addParameter("address", org_address.address)

            record.addParameter("region_id", org_address.region_id)
            record.addParameter("region_name", org_address.region_name)

            record.addParameter("city_id", org_address.city_id)
            record.addParameter("city_name", org_address.city_name)

        record.addParameter("website", edu_organization.website)
        record.addParameter("abbreviation", edu_organization.abbreviation)
        record.addParameter("phone", edu_organization.phone)
        record.addParameter("email", edu_organization.email)

        recordList.add(record)

    return ResultSelectorData(recordList, 0)


def eduCount(context, main=None, add=None, filterinfo=None, session=None, params=None,
             curValue=None, startsWith=None):
    '''Счетчик организаций'''
    sid = JsonPath.read(session, "$.sessioncontext.sid")
    org_address = org_addressCursor(context)
    edu_organization = edu_organizationCursor(context)
    org_activity_kind = org_activity_kindCursor(context)
    if params:
        filter_data = json.loads(XMLJSONConverter.xmlToJson(params))["schema"]["filter"]
        if not isinstance(filter_data, list):
            filter_data = [filter_data]

        for filter_item in filter_data:
            if filter_item.get("region_id"):
                org_address.setRange("region_id", filter_item["region_id"])

            elif filter_item.get("city_id"):
                org_address.setRange("city_id", filter_item["city_id"])

    address_list = []
    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)
            edu_organization.setFilter("uid", "|".join(edu_list))
#     else:
#         org_set = set()
# #         org_activity_kind.setFilter('kind_id','4|5')
#         for org in org_activity_kind.iterate():
#             org_set.add(org.org_id)
#         if org_set:
#             edu_organization.setFilter('uid',"|".join(["'%s'"%id for id in org_set]))
#         else:
#             edu_organization.setRange('uid','0')

    for org_address in org_address.iterate():
        address_list.append("'%s'" % org_address.address_id)
    if address_list:
        edu_organization.setFilter("address_id", "|".join(address_list))

    edu_organization.setFilter('name', "@%s'%s'%%" % ("%"*(not startsWith), curValue))

    return ResultSelectorData(None, edu_organization.count())