# -*- coding: utf-8 -*-
from datetime import datetime, timedelta
from odoo import api, fields, models
import datetime
class CurriculumReport(models.AbstractModel):
    _name = 'report.jptip_core.class_list.xlsx'
    _inherit = 'report.report_xlsx.abstract'

    def generate_xlsx_report(self,workbook, data, env):
        # 文件網址: https://xlsxwriter.readthedocs.io/format.html#set_align
        time_interval = self.env['class_schedule.print'].search([('company_id', '=', self.env.user.company_id.id)],limit=1) # 因為在ubuntu傳值會失敗, 因此需要取得wizard的資料
        start_date = time_interval.start_date # 取得使用者輸入的開始時間
        end_date = time_interval.end_date # 取得使用者輸入的結束時間
        class_data = self.env['class.timetable'].search([('date', '>=', start_date), ('date', '<=', end_date), ('company_id', '=', self.env.user.company_id.id)], order="class_name asc") # 取得課表資料並依課堂名稱排序, 確保資料的讀取的順序
        class_room = self.env['jptip.class.room'].search([('company_id','=',self.env.user.company_id.id)]) # 取得一間公司的所有教室編號
        format21 = workbook.add_format({'font_size': 10, 'align': 'center', 'text_wrap': 1, 'bold': True, 'top':1, 'left':1, 'right':1,'bottom':1}) # 設定EXCEL儲存格式, 字體10, 水平置中, 自動換行(text_wrap), 粗體,  上下左右邊框1px
        format22 = workbook.add_format({'font_size': 8, 'align': 'center', 'text_wrap': 1})
        format23 = workbook.add_format({'font_size': 12, 'align': 'vcenter', 'text_wrap': 1}) # 儲存格垂直置中(vcenter)
        format24 = workbook.add_format({'font_size': 10, 'align': 'center', 'text_wrap': 1, 'bold': True, 'top':2, 'left':2, 'right':2,'bottom':2})
        format23.set_align('center')
        format24.set_bg_color('gray') # 設定儲存格網底為灰色
        sheet = workbook.add_worksheet(u'%s 課表' % self.env.user.company_id.name[0:2]) # 建立EXCEL工作頁籤
        # -------------------------------------------------
        # 這一段是篩選掉沒有課程的日期, 例如: 使用者輸入2019-01-01至2019-01-07, 但 2019-01-01 補習班放假, 可以藉由此區塊程式篩選掉2019-01-01
        # 藉由排序的 ASC 跟 DESC 可以初步濾掉資料頭尾沒有課程的日期, 不過應該不需要這一步的, 因為後續有另外的程式碼進行篩檢
        start_day = None
        end_day = None
        for line in class_data.sorted(key=lambda r: r.date, reverse=False):
            start_day = line.date
            break
        for line in class_data.sorted(key=lambda r: r.date, reverse=True):
            end_day = line.date
            break
        # -------------------------------------------------
        days = datetime.datetime.strptime(end_day, '%Y-%m-%d') - datetime.datetime.strptime(start_day, '%Y-%m-%d') # 計算開始時間跟結束時間的天數, 後續迴圈需要用到
        delta = datetime.timedelta(days=1) # 日期加減要使用的參數值
        j = 0 # 這個代表EXCEL的 X軸
        for line in range(0, days.days + 1): # 從開始時間開始跑迴圈直至結束時間為止
            class_data_set = self.env['class.timetable'].search([('date', '=', start_day), ('company_id', '=', self.env.user.company_id.id)]) # 取得開始時間的課程資料(只會有一天的課程資料)
            if not class_data_set: # 沒有課程的日期就略過這一次的迴圈
                start_day = str(datetime.datetime.strptime(start_day, '%Y-%m-%d') + delta).replace(' 00:00:00','')  # 將開始日期往後延一天
                continue
            i = 2 # EXCEL的Y軸
            sheet.merge_range(j, 0, j, len(class_room) + 1, '%s 教室班課表' % self.env.user.company_id.class_header, format21) # EXCEL的表頭欄位, 美化用途, 此為合併儲存格方法 (x,y,x,y,內容,儲存格式)
            j += 1
            sheet.write(j, i - 2, '日期', format24) # EXCEL的(0, 1)位置
            sheet.write(j, i - 1, '時間', format24) # EXCEL的(1, 1)位置
            for row in class_room.sorted(key=lambda r: r.name, reverse=False): # 這裡的迴圈是寫入X座標(教室位置)
                sheet.write(j, i, row.name, format24)
                row.excel_location = i # 將每間教室在EXCEL位置定標到系統內儲存, 後續會用到這個參數
                i += 1 # X軸往右移1格
            j += 1 # Y軸往下移1格
            temp = j # 開始帶入課表資料前先記錄EXCEL的開始位置
            if datetime.datetime.strptime(start_day, '%Y-%m-%d').weekday() != 5 and datetime.datetime.strptime(start_day, '%Y-%m-%d').weekday() != 6: # 判斷日期是否為平常日(周一至周五)
                time_session = self.env['jt.time.session'].search([('SA_day','!=','1'),('SU_day','!=','1'),('company_id','=',self.env.user.company_id.id)]) # 取得平常日的上課時間及下課時間
                for row in time_session:
                    for x in row.time_duration_ids: # 取得每堂課的上課時間及下課時間
                        sheet.write(j,1, x.begin_time + '\n' + '  ~ \n' + x.end_time, format21) # 將上課時間及下課時間寫入EXCEL作為表頭(Y軸)
                        for y in class_data_set: # 藉由剛剛取得的課程資料, 開始篩選符合上下課時間的課程資料
                            if y.class_time_begin.begin_time == x.begin_time and y.class_time_begin.end_time == x.end_time:
                                course_seq = '' # 因為課程級數會有空值, 這會造成程式錯誤, 因此這裡必須做防錯措施
                                if y.course_seq:
                                    course_seq = y.course_seq
                                elif not y.course_seq:
                                    course_seq = ''
                                sheet.write(j, y.class_room.excel_location, y.class_name.code + '\n' + y.class_name.course_id.name + '\n' + course_seq + '\n' + y.teacher.name if y.teacher else y.class_name.course_id.name + '\n' + ('代講:' + y.teacher1.name) if y.teacher1 else '' + '\n' + course_seq + '\n', format22) # 將課程資料正確的填入EXCEL
                        j += 1 # Y軸往下移1格
                # 這裡代表迴圈已結束, 因此必須將左方的日期藉由合併儲存格的方式進行美化
                sheet.merge_range(temp, 0, j - 1, 0, str(datetime.datetime.strptime(start_day, '%Y-%m-%d').month) + '/' + str(datetime.datetime.strptime(start_day, '%Y-%m-%d').day), format23)
                start_day = str(datetime.datetime.strptime(start_day, '%Y-%m-%d') + delta).replace(' 00:00:00', '') # 將開始日期往後延一天
            elif datetime.datetime.strptime(start_day, '%Y-%m-%d').weekday() == 5 or datetime.datetime.strptime(start_day, '%Y-%m-%d').weekday() == 6:#  判斷日期是否為假日(周六&周日)
                time_session = self.env['jt.time.session'].search([('SA_day','=','1'),('SU_day','=','1'),('company_id','=',self.env.user.company_id.id)]) # 取得假日的上課時間及下課時間
                for row in time_session:
                    for x in row.time_duration_ids: # 取得每堂課的上課時間及下課時間
                        sheet.write(j,1, x.begin_time + '\n' + '  ~ \n' + x.end_time, format21) # 將上課時間及下課時間寫入EXCEL作為表頭(Y軸)
                        for y in class_data_set: # 藉由剛剛取得的課程資料, 開始篩選符合上下課時間的課程資料
                            if y.class_time_begin.begin_time == x.begin_time and y.class_time_begin.end_time == x.end_time:
                                course_seq = '' # 因為課程級數會有空值, 這會造成程式錯誤, 因此這裡必須做防錯措施
                                if y.course_seq:
                                    course_seq = y.course_seq
                                elif not y.course_seq:
                                    course_seq = ''
                                sheet.write(j, y.class_room.excel_location,y.class_name.code + '\n' + y.class_name.course_id.name + '\n' + course_seq + '\n' + y.teacher.name if y.teacher else y.class_name.course_id.name + '\n' + ('代講:' + y.teacher1.name) if y.teacher1 else '' + '\n' + course_seq + '\n', format22)
                        j += 1 # Y軸往下移1格
                # 這裡代表迴圈已結束, 因此必須將左方的日期藉由合併儲存格的方式進行美化
                sheet.merge_range(temp, 0, j - 1, 0, str(datetime.datetime.strptime(start_day, '%Y-%m-%d').month) + '/' + str(datetime.datetime.strptime(start_day, '%Y-%m-%d').day), format23)
                start_day = str(datetime.datetime.strptime(start_day, '%Y-%m-%d') + delta).replace(' 00:00:00', '') # 將開始日期往後延一天
        time_interval.unlink() # 將wizard的資料刪除, 以避免後續列印課表時, 抓到錯誤的值