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

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

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

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

    const identityRepo = await chevre.repository.Identity.createInstance(mongoose.connection);

    const cursor = identityRepo.getCursor(
        {
            // _id: { $eq: '67de46777ec0510590b68922' }
        },
        {
            _id: 1,
            about: 1,
            project: 1,
            typeOf: 1,
            issuedBy: 1
        }
    );
    console.log('docs found');

    let i = 0;
    let updateCount = 0;
    await cursor.eachAsync(async (doc) => {
        i += 1;
        const identity: Pick<
            chevre.factory.creativeWork.certification.webApplication.ICertification,
            'about' | 'project' | 'typeOf' | 'id' | 'issuedBy'
        > = doc.toObject();

        const issuedBy = identity.issuedBy;
        const numIssuedBy = (Array.isArray(identity.issuedBy)) ? identity.issuedBy.length : 1;

        // console.log(
        //     'alreadyMigrated?', identity.project.id, identity.about.id, numIssuedBy, i);
        const alreadyMigrated = Array.isArray(issuedBy);

        if (alreadyMigrated) {
            console.log(
                'already migrated.', identity.project.id, identity.about.id, identity.id, numIssuedBy, i);
        } else {
            if (typeof identity.id !== 'string') {
                throw new Error(`id undefined ${identity.id}`);
            }

            await identityRepo.updateIssuedBy2array({
                id: identity.id,
                issuedBy: [issuedBy]
            });
            updateCount += 1;
            console.log(
                'updated.', identity.project.id, identity.about.id, identity.id, numIssuedBy, i);
        }
    });

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

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