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

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

// tslint:disable-next-line:max-func-body-length
async function main() {
    await mongoose.connect(<string>process.env.MONGOLAB_URI, { autoIndex: false });

    const actionRepo = await chevre.repository.Action.createInstance(mongoose.connection);
    const cursor = actionRepo.getCursor(
        {
            // _id: { $eq: '666bf2f1903cf9f62b41ca6e' },
            typeOf: { $eq: chevre.factory.actionType.AuthorizeAction },
            // actionStatus: { $eq: chevre.factory.actionStatusType.CompletedActionStatus },
            // startDate: {
            //     $lte: moment()
            //         // tslint:disable-next-line:no-magic-numbers
            //         .add(-180, 'days'),
            //     $gte: moment()
            //         // tslint:disable-next-line:no-magic-numbers
            //         .add(-180, 'days')
            // },
            'object.typeOf': { $exists: true, $eq: chevre.factory.action.authorize.offer.eventService.ObjectType.SeatReservation },
            'instrument.typeOf': { $exists: true, $eq: chevre.factory.assetTransactionType.Reserve }
        },
        {
            __id: 1, startDate: 1, project: 1, typeOf: 1, actionStatus: 1, instrument: 1, object: 1
        }
    );
    console.log('actions found');

    let i = 0;
    let updateCount = 0;
    const saveResultCount = 0;
    // tslint:disable-next-line:max-func-body-length
    await cursor.eachAsync(async (doc) => {
        i += 1;
        const authorizeAction = <Pick<
            chevre.factory.action.authorize.offer.eventService.IAction,
            'id' | 'startDate' | 'project' | 'typeOf' | 'actionStatus' | 'instrument' | 'object'
        >>doc.toObject();

        let migrated = false;
        if (authorizeAction.instrument.typeOf === chevre.factory.assetTransactionType.COAReserveTransaction) {
            migrated = true;
        } else {
            const pendingTransaction = authorizeAction.object.pendingTransaction;
            if (pendingTransaction === undefined) {
                migrated = true;
            }
        }

        if (migrated) {
            console.log(
                'already migrated.',
                authorizeAction.project.id, authorizeAction.id, authorizeAction.actionStatus, authorizeAction.startDate,
                i, updateCount, saveResultCount);

        } else {
            // optimize action
            let unsetResult: any;
            unsetResult = await actionRepo.unsetUnnecessaryFields({
                filter: { _id: { $eq: authorizeAction.id } },
                $unset: {
                    'object.pendingTransaction': 1
                }
            });
            updateCount += 1;
            console.log(
                'result unset. unsetResult:', unsetResult,
                authorizeAction.project.id, authorizeAction.id, authorizeAction.actionStatus, authorizeAction.startDate, i,
                updateCount, saveResultCount);
        }
    });

    console.log(i, 'actions checked');
    console.log(updateCount, 'actions updated');
    console.log(saveResultCount, 'result saved');
}

main()
    .then()
    .catch(console.error);
