'use strict';

async function findPatrolRecord(ctx, next) {
    let rslt = [];
    let error = { name: 'FindError', message: '获取巡检记录失败' };
    try {
        const models = ctx.fs.dc.models;
        const { startTime, endTime, alarm, patrolPlanId, pointId } = ctx.params;
        // patrolPlanId传all查所有
        let generalInclude = [{
            model: models.PatrolPlan,
            attributes: ['name']
        }]
        if (patrolPlanId == 'all') {
            /* 如果有startTime && endTime,查询所有符合条件的数据 */
            if (startTime !== 'null' && endTime !== 'null') {
                if (pointId !== 'null') {
                    if (alarm == 'null') {
                        rslt = await models.PatrolRecord.findAll({
                            where: {
                                inspectionTime: { $between: [startTime, endTime] },
                                pointId: { $in: pointId.split(',') }
                            },
                            include: generalInclude
                        });
                    } else {
                        rslt = await models.PatrolRecord.findAll({
                            where: {
                                alarm,
                                inspectionTime: { $between: [startTime, endTime] },
                                pointId: { $in: pointId.split(',') }
                            },
                            include: generalInclude
                        });
                    }
                } else {
                    if (alarm == 'null') {
                        rslt = await models.PatrolRecord.findAll({
                            where: {
                                inspectionTime: { $between: [startTime, endTime] }
                            },
                            include: generalInclude
                        });
                    } else {
                        rslt = await models.PatrolRecord.findAll({
                            where: {
                                alarm, inspectionTime: { $between: [startTime, endTime] }
                            },
                            include: generalInclude
                        });
                    }
                }
            } else {
                /* 如果没有startTime && endTime,查询每个点位最新一条符合条件的数据 */
                let a = []
                if (pointId !== 'null') {
                    a = await models.PatrolRecord.findAll({
                        where: { pointId: { $in: pointId.split(',') } },
                        include: generalInclude
                    });

                }
                rslt = pointId.split(',').map(i => {
                    return a.filter(t => t.pointId == i).sort((a, b) => b.id - a.id)[0] || null
                })
            }
        } else {
            if (startTime !== 'null' && endTime !== 'null') {
                if (pointId !== 'null') {
                    rslt = await models.PatrolRecord.findAll({
                        where: {
                            patrolPlanId: { $in: patrolPlanId.split(',') },
                            alarm,
                            inspectionTime: { $between: [startTime, endTime] },
                            pointId: { $in: pointId.split(',') }
                        },
                        include: generalInclude
                    });
                } else {
                    rslt = await models.PatrolRecord.findAll({
                        where: {
                            patrolPlanId: { $in: patrolPlanId.split(',') },
                            alarm,
                            inspectionTime: { $between: [startTime, endTime] }
                        },
                        include: generalInclude
                    });
                }

            } else {
                let a = []
                /* 如果没有startTime && endTime,查询每个点位最新一条符合条件的数据 */
                if (pointId !== 'null') {
                    a = await models.PatrolRecord.findAll({
                        where: {
                            patrolPlanId: { $in: patrolPlanId.split(',') },
                            pointId: { $in: pointId.split(',') }
                        },
                        include: generalInclude
                    });
                } else {
                    a = await models.PatrolRecord.findAll({
                        where: {
                            patrolPlanId: { $in: patrolPlanId.split(',') }
                        },
                        include: generalInclude
                    });
                }

                rslt = pointId.split(',').map(i => {
                    return a.filter(t => t.pointId == i).sort((a, b) => b.id - a.id)[0] || null
                })
            }
        }

        ctx.status = 200;
        ctx.body = rslt;
        error = null
    } catch (error) {
        ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
        ctx.status = 400;
        ctx.body = {
            "message": "获取巡检记录失败"
        }
    }
}

async function addPatrolRecord(ctx, next) {
    let error = { name: 'addError', message: '新增巡检记录失败' };
    const transaction = await ctx.fs.dc.orm.transaction();
    try {
        const models = ctx.fs.dc.models;
        const data = ctx.request.body;
        let { patrolPlanId, inspectionTime, points, alarm, pointId } = data
        const pointRecord = await models.PatrolRecord.findAll({
            where: { pointId: pointId },
            order: [['inspectionTime', 'desc']],
            attributes: ['inspectionTime'],
        });
        const lastInspectionTime = pointRecord.length ? pointRecord[0].dataValues.inspectionTime : null;
        let record = { patrolPlanId, lastInspectionTime, inspectionTime, points, alarm, pointId }

        await models.PatrolRecord.create(record, transaction);

        // 更新巡检次数统计
        const curPlanRecord = await models.PatrolRecord.findAndCountAll({
            where: { patrolPlanId }
        });
        const patrolCount = curPlanRecord.count;
        await models.PatrolPlan.update({ patrolCount }, {
            where: { id: patrolPlanId },
            transaction
        })

        await transaction.commit();
        ctx.status = 204;
        error = null
    } catch (error) {
        await transaction.rollback();
        ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
        ctx.status = 400;
        ctx.body = {
            "message": '新增巡检计划失败'
        }
    }
}

module.exports = {
    findPatrolRecord,
    addPatrolRecord,
}