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

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

// const project = { id: String(process.env.PROJECT_ID) };

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

    const ownershipInfoRepo = await chevre.repository.OwnershipInfo.createInstance(mongoose.connection);

    const ownedThroughLt = moment()
        .add(-1, 'year')
        .toDate();
    const cursor = ownershipInfoRepo.getCursor(
        {
            ownedThrough: {
                $exists: true,
                $lt: ownedThroughLt
            }
        },
        {
        }
    );
    console.log('infos found');

    let i = 0;
    let updateCount = 0;
    await cursor.eachAsync(async (doc) => {
        i += 1;
        const ownershipInfo: Pick<
            chevre.factory.ownershipInfo.IOwnershipInfo<chevre.factory.ownershipInfo.IGood>,
            'id' | 'project' | 'identifier' | 'ownedBy' | 'ownedFrom' | 'ownedThrough'
        > = doc.toObject();

        let noNeedToDelete = true;
        let ownedById: string | undefined;
        if (ownershipInfo.ownedThrough instanceof Date
            && moment(ownedThroughLt)
                .isAfter(moment(ownershipInfo.ownedThrough))) {
            noNeedToDelete = false;
            ownedById = (Array.isArray(ownershipInfo.ownedBy)) ? ownershipInfo.ownedBy[0].id : ownershipInfo.ownedBy.id;
        }

        if (noNeedToDelete) {
            console.log(
                'noNeedToDelete.',
                ownershipInfo.project.id, ownershipInfo.identifier, ownershipInfo.id, ownershipInfo.ownedFrom, ownershipInfo.ownedThrough,
                i, updateCount);
        } else {
            console.log(
                'deleting...',
                ownershipInfo.project.id, ownershipInfo.identifier, ownershipInfo.id, ownershipInfo.ownedFrom, ownershipInfo.ownedThrough,
                i, updateCount);
            if (typeof ownedById === 'string') {
                // await ownershipInfoRepo.deleteByIdAndOwnedById({
                //     project: { id: ownershipInfo.project.id },
                //     id: ownershipInfo.id,
                //     ownedBy: { id: ownedById }
                // });
            }
            updateCount += 1;
            console.log(
                'deleted.',
                ownershipInfo.project.id, ownershipInfo.identifier, ownershipInfo.id, ownershipInfo.ownedFrom, ownershipInfo.ownedThrough,
                i, updateCount);
        }
    });

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

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