# -*- encoding: utf-8 -*-
# -----------------------------------------------------------------------------
# @File Name  : report_service.py
# @Time       : 2021/1/13 下午3:14
# @Author     : X. Peng
# @Email      : acepengxiong@163.com
# @Software   : PyCharm
# -----------------------------------------------------------------------------
import datetime
import json
import os
import uuid

from sqlalchemy import and_, or_
# from sqlalchemy import union_all

from app.api.engine import TAMP_SQL, tamp_diagnose_app_engine, template_folder, temp_img_save_folder
from app.model.tamp_diagnose_app import HoldReport, HoldDiagnoseReport, PeriodicReport, Customer, ReportView
from app.utils.jinjia2html_v2 import DataIntegrate
from app.celery import save_pdf


def get_report_list(args):
    """."""
    type = args.get('type')
    ifa_id = args.get('ifa_id')
    name = args.get('name')
    pageNumber = args['pageNumber']
    pageSize = args['pageSize']
    start_time = args.get('start_time')
    end_time = args.get('end_time')
    offset = (pageNumber - 1) * pageSize
    res = []
    totalSize = 0
    conditions = ()
    if type == 0:
        conditions = [
                ReportView.ifa_id == ifa_id,
                or_(ReportView.name.like('%' + name + '%'), ReportView.customer_name.like('%' + name + '%')),
                ReportView.create_time >= start_time,
                ReportView.create_time <= end_time
        ]
    else:
        conditions = [
                ReportView.ifa_id == ifa_id,
                ReportView.type == type,
                or_(ReportView.name.like('%' + name + '%'), ReportView.customer_name.like('%' + name + '%')),
                ReportView.create_time >= start_time,
                ReportView.create_time <= end_time
        ]
    allow_field = ['id', 'customer_id', 'ifa_id', 'update_time', 'create_time', 'update_status', 'file', 'be_viewed', 'name', 'customer_name', 'author_name', 'type']
    with TAMP_SQL(tamp_diagnose_app_engine) as tamp_diagnose_app:
        tamp_diagnose_session = tamp_diagnose_app.session
        report_res = tamp_diagnose_session.query(ReportView).filter(and_(*conditions))
        totalSize = report_res.count()
        report_res = report_res.order_by(ReportView.create_time.desc()).offset(offset).limit(pageSize)
        res = [r.to_dict(allow_field=allow_field) for r in report_res]

    return {
        'content': res,
        'pageNum': pageNumber,
        'pageSize': pageSize,
        'totalSize': totalSize
    }


def delete_report(args):
    """."""
    type = args.get('type')
    id = args.get('id')
    ifa_id = args.get('ifa_id')
    with TAMP_SQL(tamp_diagnose_app_engine) as tamp_diagnose_app:
        tamp_diagnose_session = tamp_diagnose_app.session
        if type == 1:
            tamp_diagnose_session.query(HoldReport).filter(and_(
                HoldReport.ifa_id == ifa_id,
                HoldReport.id == id
            )).delete()
        elif type == 2:
            tamp_diagnose_session.query(HoldDiagnoseReport).filter(and_(
                HoldDiagnoseReport.ifa_id == ifa_id,
                HoldDiagnoseReport.id == id
            )).delete()
        elif type == 3:
            tamp_diagnose_session.query(PeriodicReport).filter(and_(
                PeriodicReport.ifa_id == ifa_id,
                PeriodicReport.id == id
            )).delete()


def get_one_report(args):
    """."""
    id = args.get('id')
    type = args.get('type')
    ifa_id = args.get('ifa_id')
    data = []
    with TAMP_SQL(tamp_diagnose_app_engine) as tamp_diagnose_app:
        tamp_diagnose_session = tamp_diagnose_app.session
        res = tamp_diagnose_session.query(ReportView).filter(and_(
            ReportView.id == id,
            ReportView.type == type,
            ReportView.ifa_id == ifa_id,
        ))
        data = [r.to_dict() for r in res]
    if data:
        return data[0]
    return False

def edit_report_name(args):
    """编辑报告"""
    id = args.get('id')
    type = args.get('type')
    ifa_id = args.get('ifa_id')
    name = args.get('name')
    res = []
    with TAMP_SQL(tamp_diagnose_app_engine) as tamp_diagnose_app:
        tamp_diagnose_session = tamp_diagnose_app.session
        if type == 1:
            res = tamp_diagnose_session.query(HoldReport).filter(and_(
                HoldReport.id == id,
                HoldReport.ifa_id == ifa_id,
            ))
        elif type == 2:
            res = tamp_diagnose_session.query(HoldDiagnoseReport).filter(and_(
                HoldDiagnoseReport.id == id,
                HoldDiagnoseReport.ifa_id == ifa_id,
            ))
        elif type == 3:
            res = tamp_diagnose_session.query(PeriodicReport).filter(and_(
                PeriodicReport.id == id,
                PeriodicReport.ifa_id == ifa_id,
            ))
        else:
            return False
        r = res.update({
            'name': name,
            'update_time': datetime.datetime.now()
        })
    return True

def edit_report(args):
    """编辑报告"""
    id = args.get('id')
    type = args.get('type')
    ifa_id = args.get('ifa_id')
    report_data = args.get('report_data')
    pdf_name = str(uuid.uuid4()) + '.pdf'
    res = []
    with TAMP_SQL(tamp_diagnose_app_engine) as tamp_diagnose_app:
        tamp_diagnose_session = tamp_diagnose_app.session
        hold_report = tamp_diagnose_session.query(HoldReport).filter(and_(
            HoldReport.id == id,
            HoldReport.ifa_id == ifa_id,
        ))
        hold_diagnose_report = tamp_diagnose_session.query(HoldDiagnoseReport).filter(and_(
            HoldDiagnoseReport.id == id,
            HoldDiagnoseReport.ifa_id == ifa_id,
        ))
        periodic_report = tamp_diagnose_session.query(PeriodicReport).filter(and_(
            PeriodicReport.id == id,
            PeriodicReport.ifa_id == ifa_id,
        ))
        if type == 1:
            res = hold_report
        elif type == 2:
            res = hold_diagnose_report
        elif type == 3:
            res = periodic_report
        if not res:
            return False
        r = res.update({
            'report_data': report_data,
            'update_status': 1,
            'update_time': datetime.datetime.now()
        })
        
    save_pdf.delay(id, ifa_id, res[0].customer_id, pdf_name, type, report_data)
        # try:
        #     dt = DataIntegrate(ifa_id=ifa_id, customer_id=res[0].customer_id, pdf_name=pdf_name, type=type)
        #     dt.render_data(data=json.loads(report_data.replace(template_folder, temp_img_save_folder)))
        # except:
        #     pass
        # with TAMP_SQL(tamp_diagnose_app_engine) as tamp_diagnose_app:
        #     tamp_diagnose_session = tamp_diagnose_app.session
        #     hold_report = tamp_diagnose_session.query(HoldReport).filter(and_(
        #         HoldReport.id == id,
        #         HoldReport.ifa_id == ifa_id,
        #     ))
        #     hold_diagnose_report = tamp_diagnose_session.query(HoldDiagnoseReport).filter(and_(
        #         HoldDiagnoseReport.id == id,
        #         HoldDiagnoseReport.ifa_id == ifa_id,
        #     ))
        #     periodic_report = tamp_diagnose_session.query(PeriodicReport).filter(and_(
        #         PeriodicReport.id == id,
        #         PeriodicReport.ifa_id == ifa_id,
        #     ))
        #     if type == 1:
        #         res = hold_report
        #     elif type == 2:
        #         res = hold_diagnose_report
        #     elif type == 3:
        #         res = periodic_report
        #     if not res:
        #         return False
        #     res.update({
        #         'file': pdf_name,
        #         'update_status': 2,
        #         'update_time': datetime.datetime.now()
        #     })
    return True


def make_report(args):
    """制作报告."""
    ifa_id = args.get('ifa_id')
    customer_id = args.get('customer_id')
    type = args.get('type')
    name = args.get('name')
    report_data = json.loads(args.get('report_data').replace(template_folder, temp_img_save_folder))
    pdf_name = str(uuid.uuid4()) + '.pdf'
    args['create_time'] = datetime.datetime.now()
    args['update_status'] = 1

    args.pop('type')
    record_id = 0
    with TAMP_SQL(tamp_diagnose_app_engine) as tamp_diagnose_app:
        tamp_diagnose_session = tamp_diagnose_app.session
        report_record = None
        if type == 1:
            report_record = HoldReport(**args)
        elif type == 2:
            report_record = HoldDiagnoseReport(**args)
        elif type == 3:
            report_record = PeriodicReport(**args)
        if not report_record:
            return False
        tamp_diagnose_session.add(report_record)
        tamp_diagnose_session.flush()
        record_id = report_record.id

    save_pdf.delay(record_id, ifa_id, customer_id, pdf_name, type, report_data)
    return {'record_id': record_id}
    # pid = os.fork()
    # if pid == 0:
    #     try:
    #         dt = DataIntegrate(ifa_id=ifa_id, customer_id=customer_id, pdf_name=pdf_name, type=type)
    #         dt.render_data(data=report_data)
    #     except:
    #         pass
    #     with TAMP_SQL(tamp_diagnose_app_engine) as tamp_diagnose_app:
    #         tamp_diagnose_session = tamp_diagnose_app.session
    #         hold_report = tamp_diagnose_session.query(HoldReport).filter(and_(
    #             HoldReport.id == record_id,
    #             HoldReport.ifa_id == ifa_id,
    #         ))
    #         hold_diagnose_report = tamp_diagnose_session.query(HoldDiagnoseReport).filter(and_(
    #             HoldDiagnoseReport.id == record_id,
    #             HoldDiagnoseReport.ifa_id == ifa_id,
    #         ))
    #         periodic_report = tamp_diagnose_session.query(PeriodicReport).filter(and_(
    #             PeriodicReport.id == record_id,
    #             PeriodicReport.ifa_id == ifa_id,
    #         ))
    #         if type == 1:
    #             res = hold_report
    #         elif type == 2:
    #             res = hold_diagnose_report
    #         elif type == 3:
    #             res = periodic_report
    #         if not res:
    #             return False
    #         res.update({
    #             'file': pdf_name,
    #             'update_status': 2,
    #             'update_time': datetime.datetime.now()
    #         })
    # else:
    #     return {'record_id': record_id}
