# coding: utf-8

from java.util import ArrayList
import json

from edu._edu_orm import vw_module_courseCursor
from nci._nci_orm import vw_regionCursor, edu_organizationCursor, \
    org_addressCursor
from ru.curs.celesta.showcase.utils import XMLJSONConverter


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

def regionList(context, main=None, add=None, filterinfo=None, session=None, params=None,
               curValue=None, startsWith=None, firstRecord=None, recordCount=None):
    '''Список регионов'''

    region = vw_regionCursor(context)
    vw_module_course = vw_module_courseCursor(context)
    edu_organization = edu_organizationCursor(context)
    org_address = org_addressCursor(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("module_id"):
                vw_module_course.setRange("module_id", filter_item["module_id"])
                region.setRange("region_id", '-1')

                if vw_module_course.count():
                    edu_org_list = ["'%s'" % vw_module_course.course_edu_org_id for vw_module_course in vw_module_course.iterate()]
                    edu_organization.setFilter("uid", "|".join(edu_org_list))

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

                        if org_address.count():
                            region_list = ["'%s'" % org_address.region_id for org_address in org_address.iterate()]
                            region.setFilter("region_id", "|".join(region_list))

    if not region.count():
        context.error(u"Нет доступных регионов")
    region.orderBy('region_name')
    region.setFilter('region_name', "@%s'%s'%%" % ("%"*(not startsWith), curValue))
    region.limit(firstRecord, recordCount)

    recordList = ArrayList()
    for region in region.iterate():
        rec = DataRecord()
        rec.id = str(region.region_id)
        rec.name = region.region_name
        recordList.add(rec)

    return ResultSelectorData(recordList, 0)

def regionCount(context, main=None, add=None, filterinfo=None, session=None, params=None,
               curValue=None, startsWith=None):
    '''Счетчик регионов'''
    region = vw_regionCursor(context)
    vw_module_course = vw_module_courseCursor(context)
    edu_organization = edu_organizationCursor(context)
    org_address = org_addressCursor(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("module_id"):
                vw_module_course.setRange("module_id", filter_item["module_id"])
                region.setRange("region_id", '-1')
                if vw_module_course.count():
                    edu_org_list = ["'%s'" % vw_module_course.course_edu_org_id for vw_module_course in vw_module_course.iterate()]
                    edu_organization.setFilter("uid", "|".join(edu_org_list))
                    if edu_organization.count():
                        address_list = ["'%s'" % edu_organization.address_id for edu_organization in edu_organization.iterate()]
                        org_address.setFilter("address_id", "|".join(address_list))
                        if org_address.count():
                            region_list = ["'%s'" % org_address.region_id for org_address in org_address.iterate()]
                            region.setFilter("region_id", "|".join(region_list))
    region.setFilter('region_name', "@%s'%s'%%" % ("%"*(not startsWith), curValue))

    return ResultSelectorData(None, region.count())