// 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 assetTransactionRepo = await chevre.repository.AssetTransaction.createInstance(mongoose.connection);

    const cursor = assetTransactionRepo.getCursor(
        {
            typeOf: { $eq: chevre.factory.assetTransactionType.CancelReservation }
            // 'project.id': { $ne: EXCLUDED_PROJECT_ID }
        },
        {}
    );
    console.log('assetTransactions found');

    let i = 0;
    let updateCount = 0;
    await cursor.eachAsync(async (doc) => {
        i += 1;
        const assetTransaction: chevre.factory.assetTransaction.cancelReservation.ITransaction = doc.toObject();

        const alreadyMigrated = assetTransaction.object.typeOf === chevre.factory.reservationType.ReservationPackage
            && typeof assetTransaction.object.reservationNumber === 'string'
            && assetTransaction.object.reservationNumber.length > 0;

        if (alreadyMigrated) {
            console.log(
                'already migrated.',
                assetTransaction.project.id, assetTransaction.typeOf, assetTransaction.transactionNumber, assetTransaction.startDate, i);
        } else {
            let reservationNumber: string | undefined;
            if (typeof assetTransaction.object.transaction?.transactionNumber === 'string') {
                reservationNumber = assetTransaction.object.transaction.transactionNumber;
            } else if (typeof assetTransaction.object.reservations?.[0].reservationNumber === 'string') {
                reservationNumber = assetTransaction.object.reservations[0].reservationNumber;
            }
            if (typeof reservationNumber !== 'string') {
                console.error(
                    'reservationNumber not found.',
                    assetTransaction.project.id,
                    assetTransaction.typeOf, assetTransaction.transactionNumber, assetTransaction.startDate, i);
                throw new Error('reservationNumber not found');
            }
            console.log(
                'updating assetTransaction...',
                assetTransaction.project.id,
                assetTransaction.typeOf, assetTransaction.transactionNumber, assetTransaction.startDate, reservationNumber, i);
            await assetTransactionRepo.migrateObjectReservationNumber({
                id: assetTransaction.id,
                object: { reservationNumber }
            });
            updateCount += 1;
            console.log(
                'updated.',
                assetTransaction.project.id,
                assetTransaction.typeOf, assetTransaction.transactionNumber, assetTransaction.startDate, i);
        }
    });

    console.log(i, 'assetTransactions checked');
    console.log(updateCount, 'assetTransactions updated');
}

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