# coding: utf-8
'''
Created on 04.06.2014

@author: Victor B.
'''
#                                                                      not ended !!!!!
import datetime
from java.io import FileOutputStream
from java.text import SimpleDateFormat
import json

from edu._edu_orm import vw_courseCursor, course_cycleCursor, \
    course_edu_formCursor, courseCursor
from edu.reports.printExcelReports import printToExcel
from nci._nci_orm import education_formCursor, edu_organizationCursor
from ru.curs.celesta.showcase.utils import XMLJSONConverter
from umk._umk_orm import specialityCursor


#try:
#    from ru.curs.showcase.util import XMLJSONConverter as XMLJSONConverter2
#except:
#    from ru.curs.celesta.showcase.utils import XMLJSONConverter as XMLJSONConverter2
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
    from ru.curs.showcase.core import UserMessage
    from ru.curs.showcase.app.api import MessageType
except:
    from ru.curs.celesta.showcase import JythonDTO



def reportData(context):
    u'''Отчет по внебюджетным слушателям (по зачислению)'''

    speciality = specialityCursor(context)
    vw_course = vw_courseCursor(context)
    course_edu_form = course_edu_formCursor(context)
    education_form = education_formCursor(context)
    edu_organization = edu_organizationCursor(context)
    course_cycle = course_cycleCursor(context)
    speciality.orderBy('name')
    sdf = SimpleDateFormat('dd.MM.yyyy')
    
    data = {"schema":
            {"edu_org":
             [],
             'date':sdf.format(datetime.datetime.now())
            }
        }
    edu_organization.orderBy('name')
    count_edu_org = 1
    for edu_org in edu_organization.iterate():
        count_program = 1
        edu_org_dict = {"name":edu_org.shortname,
                     "number":count_edu_org,
                     "program":''
                     }
        program_list = []
        vw_course.setRange('edu_organization_id',edu_organization.uid)
        vw_course.orderBy('speciality_name')
        for course in vw_course.iterate():
            course_cycle.setRange('course_id',course.uid)
            edu_forms = []
            course_edu_form.setRange('course_id', course.uid)
            for course_edu_form in course_edu_form.iterate():
                education_form.get(course_edu_form.edu_form_id)
                edu_forms.append(education_form.name)
            
            program_dict = {'number':'%d.%d' % (count_edu_org,count_program),
                            'spec_name':course.speciality_name,
                            'name':course.name,
                            'type':u'ПК',
                            'edu_forms': ','.join(edu_forms),
                            'internship':u'Да' if course.internship else u'Нет',
                            'simulation':u'Да' if course.osk else u'Нет',
                            'dot_eo':u'Да' if course.dot_and_eo else u'Нет',
                            'zet':course.course_hours if course.course_hours else '',
                            'zet_internship':course.internship_hours if course.internship_hours else '',
                            'zet_simulation':course.osk_hours if course.osk_hours else '',
                            'cycles_number':course_cycle.count(),
                            'edu_cost':course.edu_cost
                            }
            count_program += 1
            program_list.append(program_dict)
        edu_org_dict['program'] = program_list
        if program_list:
            count_edu_org += 1
            data['schema']['edu_org'].append(edu_org_dict)


    xmlData = XMLJSONConverter.jsonToXml(json.dumps(data))
    return (u'<?xml version="1.0" encoding="UTF-8"?> %s' % xmlData)


def get_counts(vw_course):
    spec_set = set()
    for course in vw_course.iterate():
        if course.speciality_id not in spec_set:
            spec_set.add(course.speciality_id)
    count_program = vw_course.count()
    vw_course.setRange('internship', True)
    count_intern = vw_course.count()
    vw_course.setRange('internship')
    vw_course.setRange('osk', True)
    count_sim = vw_course.count()
    vw_course.setRange('osk')
    vw_course.setRange('dot_and_eo')
    count_dot_eo = vw_course.count()
    vw_course.setRange('dot_and_eo')
    
    return len(spec_set), count_program, count_sim, count_intern, count_dot_eo
    
def consolidateReportData(context):
    u'''Отчет по внебюджетным слушателям (по зачислению)'''

    course= courseCursor(context)
    speciality = specialityCursor(context)
    vw_course = vw_courseCursor(context)
    course_edu_form = course_edu_formCursor(context)
    education_form = education_formCursor(context)
    edu_organization = edu_organizationCursor(context)
    course_cycle = course_cycleCursor(context)
    speciality.orderBy('name')
    sdf = SimpleDateFormat('dd.MM.yyyy')
    
    data = {"schema":
            {"edu_org":
             [],
             'date':sdf.format(datetime.datetime.now())
            }
        }
    edu_organization.orderBy('name')
    count_edu_org = 1
    for edu_org in edu_organization.iterate():

        edu_org_dict = {"name":edu_org.shortname,
                     "number":count_edu_org,
                     }
        course.setRange('edu_organization_id',edu_organization.uid)
        
        course.setFilter('status_id', '0|1|2|3|8')
        edu_org_dict['all_spec'],edu_org_dict['all_program'], edu_org_dict['all_simulation'],\
        edu_org_dict['all_internship'], edu_org_dict['all_dot_eo'] = get_counts(course)
        
        course.setRange('status_id', 3)
      
        edu_org_dict['appr_spec'],edu_org_dict['appr_program'], edu_org_dict['appr_simulation'],\
        edu_org_dict['appr_internship'], edu_org_dict['appr_dot_eo'] = get_counts(course)

        course.setRange('status_id', 2)
      
        edu_org_dict['check_spec'],edu_org_dict['check_program'], edu_org_dict['check_simulation'],\
        edu_org_dict['check_internship'], edu_org_dict['check_dot_eo'] = get_counts(course)
        
        course.setFilter('status_id', '0|1|8')
      
        edu_org_dict['form_spec'],edu_org_dict['form_program'], edu_org_dict['form_simulation'],\
        edu_org_dict['form_internship'], edu_org_dict['form_dot_eo'] = get_counts(course) 
        
        data['schema']['edu_org'].append(edu_org_dict)
          
        count_edu_org += 1

    xmlData = XMLJSONConverter.jsonToXml(json.dumps(data))
    return (u'<?xml version="1.0" encoding="UTF-8"?> %s' % xmlData)

def printToFlute(context, params):
    u'''Функция для подготовки печатных форм через флейту.
    '''

    arg_dict = json.loads(params.params)
    data = reportData(context)
    # печатаем в resultstream флейты
    printToExcel(data, 'programReport.xls', 'programReport.xml', params.resultstream)

def printConsolidateToFlute(context, params):
    u'''Функция для подготовки печатных форм через флейту.
    '''

    arg_dict = json.loads(params.params)
    data = consolidateReportData(context)
    # печатаем в resultstream флейты
    printToExcel(data, 'consolidateProgramReport.xls', 'consolidateProgramReport.xml', params.resultstream)