// 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) };
// const EXCLUDED_PROJECT_ID = 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 additionalPropertyRepo = await chevre.repository.AdditionalProperty.createInstance(mongoose.connection);
    const customerRepo = await chevre.repository.Customer.createInstance(mongoose.connection);

    const cursor = customerRepo.getCursor(
        {
            // typeOf: { $eq: chevre.factory.placeType.ScreeningRoom }
            // 'project.id': { $eq: project.id },
            // 'project.id': { $ne: EXCLUDED_PROJECT_ID },
        },
        {
            // paymentMethods: 1,
            // project: 1,
            // orderDate: 1
        }
    );
    console.log('docs found');

    const additionalPropertyNames: string[] = [];
    const projectIds: string[] = [];
    const unexpextedprojectIds: string[] = [];
    let checked: number = 0;
    let created: number = 0;

    let i = 0;
    await cursor.eachAsync(async (doc) => {
        i += 1;
        const customer: chevre.factory.customer.ICustomer = doc.toObject();

        const additionalPropertyNamesOnResource = (Array.isArray(customer.additionalProperty))
            ? customer.additionalProperty?.map((p) => p.name)
            : [];
        if (Array.isArray(additionalPropertyNamesOnResource) && additionalPropertyNamesOnResource.length > 0) {
            console.log(
                additionalPropertyNamesOnResource.join(','),
                additionalPropertyNamesOnResource.length,
                'additionalPropertyNamesOnResource found',
                customer.project.id,
                customer.branchCode
            );
            additionalPropertyNames.push(...additionalPropertyNamesOnResource);
            projectIds.push(customer.project.id);
            additionalPropertyNamesOnResource.forEach((name) => {
                if (!name.match(/^[a-zA-Z]*$/)) {
                    unexpextedprojectIds.push(customer.project.id);
                }
                // tslint:disable-next-line:no-magic-numbers
                if (name.length < 5) {
                    unexpextedprojectIds.push(customer.project.id);
                }
            });

            for (const additionalPropertyNameOnResource of additionalPropertyNamesOnResource) {
                checked += 1;
                const existingAdditionalProperties = <{ id: string }[]>await additionalPropertyRepo.projectFields(
                    {
                        limit: 1,
                        project: { id: { $eq: customer.project.id } },
                        codeValue: { $eq: additionalPropertyNameOnResource },
                        inCodeSet: { identifier: { $eq: customer.typeOf } }
                    },
                    ['id']);
                if (existingAdditionalProperties.length === 0) {
                    const additionalProperty: chevre.factory.additionalProperty.IAdditionalProperty = {
                        project: customer.project,
                        // id?: string;
                        typeOf: 'CategoryCode',
                        codeValue: additionalPropertyNameOnResource,
                        inCodeSet: {
                            typeOf: 'CategoryCodeSet',
                            identifier: customer.typeOf
                        },
                        name: { ja: additionalPropertyNameOnResource }
                    };
                    await additionalPropertyRepo.save({ attributes: additionalProperty });
                    created += 1;
                    console.log(
                        'additionalProerty created',
                        additionalPropertyNameOnResource,
                        customer.project.id,
                        customer.branchCode
                    );
                } else {
                    console.log(
                        'additionalProerty existed',
                        additionalPropertyNameOnResource,
                        customer.project.id,
                        customer.branchCode
                    );
                }
            }
        }
    });
    console.log(i, 'places checked');
    console.log('additionalPropertyNames:', [...new Set(additionalPropertyNames)]);
    console.log('projectIds:', [...new Set(projectIds)]);
    console.log('unexpextedprojectIds:', [...new Set(unexpextedprojectIds)]);
    console.log('checked:', checked);
    console.log('created:', created);
}

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