# -*- 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

from sqlalchemy import and_
# from sqlalchemy import union_all

from app.api.engine import TAMP_SQL, tamp_diagnose_app_engine
from app.model.tamp_diagnose_app import HoldReport, HoldDiagnoseReport, PeriodicReport


def get_report_list(args):
    """."""
    type = args.get('type')
    ifa_id = args.get('ifa_id')
    pageNumber = args['pageNumber']
    pageSize = args['pageSize']
    start_time = args.get('start_time')
    end_time = args.get('end_time')
    offset = (pageNumber - 1) * pageSize
    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.ifa_id == ifa_id,
            HoldReport.update_time >= start_time,
            HoldReport.update_time <= end_time
        ))
        hold_diagnose_report = tamp_diagnose_session.query(HoldDiagnoseReport).filter(and_(
            HoldDiagnoseReport.ifa_id == ifa_id,
            HoldDiagnoseReport.update_time >= start_time,
            HoldDiagnoseReport.update_time <= end_time
        ))
        periodic_report = tamp_diagnose_session.query(PeriodicReport).filter(and_(
            PeriodicReport.ifa_id == ifa_id,
            PeriodicReport.update_time >= start_time,
            PeriodicReport.update_time <= end_time
        ))
        if type == 0:
            res = hold_report.union_all(hold_diagnose_report).union_all(periodic_report)
        elif type == 1:
            res = hold_report
        elif type == 2:
            res = hold_diagnose_report
        elif type == 3:
            res = periodic_report
    totalSize = res.count()
    data = res.offset(offset).limit(pageSize)
    data = [r.to_dict() for r in data]
    return {
        'content': data,
        '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')
    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 == 0:
            res = hold_report.union_all(hold_diagnose_report).union_all(periodic_report)
        elif type == 1:
            res = hold_report
        elif type == 2:
            res = hold_diagnose_report
        elif type == 3:
            res = periodic_report
    data = [r.to_dict() for r in res]
    return data


def edit_report(args):
    """编辑报告"""
    id = args.get('id')
    type = args.get('type')
    ifa_id = args.get('ifa_id')
    report_data = args.get('report_data')
    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_time': datetime.datetime.now()
        })
        if r > 0:
            return True
    return False
