// tslint:disable:no-console
import * as mongoose from 'mongoose';

import { chevre } from '../../../../lib/index';

mongoose.connect(<string>process.env.MONGOLAB_URI, { autoIndex: false });

// tslint:disable-next-line:max-func-body-length
async function main() {
    const now = new Date();
    console.log('--------', 'aggregating...', ' --------', now);

    const assetTransactionRepo = await chevre.repository.AssetTransaction.createInstance(mongoose.connection);
    const transactionRepo = await chevre.repository.Transaction.createInstance(mongoose.connection);
    const taskRepo = await chevre.repository.Task.createInstance(mongoose.connection);

    // {status:"InProgress"}を確認
    // {"tasksExportAction.actionStatus":{$ne:"CompletedActionStatus"}}を確認

    for (const transactionType of [
        chevre.factory.transactionType.PlaceOrder,
        chevre.factory.transactionType.ReturnOrder
    ]) {
        const inProgressCount = await transactionRepo.count({
            limit: 1000,
            status: { $in: [chevre.factory.transactionStatusType.InProgress] },
            typeOf: transactionType
        });
        console.log(transactionType, 'inProgressCount:', inProgressCount.count, now);

        const unCompletedTasksExportCount = await transactionRepo.count({
            limit: 1000,
            tasksExportAction: {
                actionStatus: {
                    $in: [
                        chevre.factory.actionStatusType.ActiveActionStatus,
                        chevre.factory.actionStatusType.CanceledActionStatus,
                        chevre.factory.actionStatusType.FailedActionStatus,
                        chevre.factory.actionStatusType.PotentialActionStatus
                    ]
                }
            },
            typeOf: transactionType
        });
        console.log(transactionType, 'unCompletedTasksExportCount:', unCompletedTasksExportCount.count, now);
    }

    for (const assetTransactionType of [
        chevre.factory.assetTransactionType.Pay,
        chevre.factory.assetTransactionType.Refund,
        chevre.factory.assetTransactionType.Reserve,
        chevre.factory.assetTransactionType.CancelReservation
    ]) {
        const inProgressCount = await assetTransactionRepo.count({
            limit: 1000,
            status: { $in: [chevre.factory.transactionStatusType.InProgress] },
            typeOf: <any>assetTransactionType
        });
        console.log(assetTransactionType, 'inProgressCount:', inProgressCount.count, now);

        const unCompletedTasksExportCount = await assetTransactionRepo.count({
            limit: 1000,
            tasksExportAction: {
                actionStatus: {
                    $in: [
                        chevre.factory.actionStatusType.ActiveActionStatus,
                        chevre.factory.actionStatusType.CanceledActionStatus,
                        chevre.factory.actionStatusType.FailedActionStatus,
                        chevre.factory.actionStatusType.PotentialActionStatus
                    ]
                }
            },
            typeOf: <any>assetTransactionType
        });
        console.log(assetTransactionType, 'unCompletedTasksExportCount:', unCompletedTasksExportCount.count, now);
    }

    const readyTaskCount = await taskRepo.count({
        limit: 100,
        statuses: [
            chevre.factory.taskStatus.Ready,
            chevre.factory.taskStatus.Running
        ],
        name: {
            $nin: [
                chevre.factory.taskName.ImportEventCapacitiesFromCOA,
                chevre.factory.taskName.ImportEventsFromCOA,
                chevre.factory.taskName.ImportOffersFromCOA
            ]
        },
        runsThrough: now
    });
    console.log('readyTaskCount:', readyTaskCount.count, now);
}

const INTERVAL_MS = 60000;
// const INTERVAL_MS = 5000;
setInterval(
    () => {
        main()
            .then()
            .catch(console.error);
    },
    INTERVAL_MS
);
