# -*- 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, pdf_save_folder
from app.model.tamp_diagnose_app import HoldReport, HoldDiagnoseReport, PeriodicReport, Customer, ReportView, FundReportManange
from app.utils.jinjia2html_v2 import DataIntegrate
from app.celery import save_pdf
from app.utils.format_transfer import npEncoder


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:
        if start_time and end_time:
            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,
                    or_(ReportView.name.like('%' + name + '%'), ReportView.customer_name.like('%' + name + '%'))
                ]
    else:
        if start_time and end_time:
            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
            ]
        else:
            conditions = [
                    ReportView.ifa_id == ifa_id,
                    ReportView.type == type,
                    or_(ReportView.name.like('%' + name + '%'), ReportView.customer_name.like('%' + name + '%'))
            ]
    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')
    report_data_json = json.loads(args.get('report_data').replace(template_folder, temp_img_save_folder))
    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_json)
        # 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}

def make_app_report(args):
    """制作报告."""
    ifa_id = args.get('ifa_id')
    customer_id = args.get('customer_id')
    type = 1
    pdf_name = str(uuid.uuid4()) + '.pdf'
    args['file'] = pdf_name
    args['create_time'] = datetime.datetime.now()
    args['update_status'] = 2
    custom_time = args['custom_time']

    data = {}
    record_id = 0
    report_data = ''
    default_template = ''
    with TAMP_SQL(tamp_diagnose_app_engine) as tamp_diagnose_app:
        tamp_diagnose_session = tamp_diagnose_app.session
        # 查找当前时间是否有生成的pdf
        hr = tamp_diagnose_session.query(HoldReport).filter(HoldReport.custom_time == custom_time,
                                                       HoldReport.ifa_id == ifa_id,
                                                       HoldReport.customer_id == customer_id).first()
        if hr:
            return hr.id
        customer_name = ''
        type_name = '持仓报告'
        create_date = str(datetime.datetime.now().date())
        sql = "select customer_name from customer_view where id = '{}'".format(customer_id)
        res = tamp_diagnose_session.execute(sql)
        res = res.fetchone()
        if res:
            customer_name = res[0]
        args['name'] = customer_name + type_name + create_date
        
        template = tamp_diagnose_session.query(FundReportManange).filter(and_(
            FundReportManange.ifa_id == ifa_id,
            FundReportManange.type == 1,
            FundReportManange.default == 1
        )).first()
        default_template = ""
        if template and template.default_template:
            default_template = json.loads(template.default_template)
        elif template:
            default_template = json.loads(template.custom_template)
    # save_pdf.delay(record_id, ifa_id, customer_id, pdf_name, type)
    try:
        dt = DataIntegrate(ifa_id=ifa_id, customer_id=customer_id, pdf_name=pdf_name, type=type, end_date = custom_time)
        report_data = dt.get_template_data(default_template=default_template)
        report_data = json.dumps(report_data, cls=npEncoder, ensure_ascii=False)
        args['report_data'] = report_data
        dt.render_data(data=json.loads(report_data.replace(template_folder, temp_img_save_folder)))
    except OSError:
        pass
    except Exception as e:
        return False
    
    if os.path.exists(pdf_save_folder + pdf_name):
        with TAMP_SQL(tamp_diagnose_app_engine) as tamp_diagnose_app:
            tamp_diagnose_session = tamp_diagnose_app.session
            args['update_time'] = datetime.datetime.now()
            report_record = HoldReport(**args)
            tamp_diagnose_session.add(report_record)
            tamp_diagnose_session.flush()
            return report_record.id
 
    return False