// 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) };

async function main() {
    await mongoose.connect(<string>process.env.MONGOLAB_URI, { autoIndex: false });

    const acceptedOfferRepo = await chevre.repository.AcceptedOffer.createInstance(mongoose.connection);
    const orderRepo = await chevre.repository.Order.createInstance(mongoose.connection);
    const taskRepo = await chevre.repository.Task.createInstance(mongoose.connection);

    const cursor = orderRepo.getCursor(
        {
            'project.id': { $eq: project.id },
            // orderNumber: { $eq: 'SSK9-4896645-5698154' },
            orderDate: {
                $lte: moment('2024-07-03T18:00:00Z')
                    .toDate(),
                $gte: moment('2024-06-30T18:00:00Z')
                    .toDate()
            },
            orderStatus: { $eq: chevre.factory.orderStatus.OrderProcessing }
        },
        {
            confirmationNumber: 1,
            orderDate: 1, orderNumber: 1,
            project: 1, typeOf: 1, orderStatus: 1
        }
    );
    console.log('orders found');

    let i = 0;
    let updateCount = 0;
    await cursor.eachAsync(async (doc) => {
        i += 1;
        const order: Pick<chevre.factory.order.IOrder, 'confirmationNumber' | 'orderDate' | 'orderNumber' | 'project' | 'typeOf' | 'orderStatus'> = doc.toObject();
        if (order.orderStatus !== chevre.factory.orderStatus.OrderProcessing) {
            console.log('nothing to do', order.orderStatus, order.orderNumber);
        } else {
            const { orderNumber } = order;

            const itemOfferedTypeOfs = <chevre.factory.order.IItemOffered['typeOf'][]>await acceptedOfferRepo.distinctValues(
                { orderNumber: { $in: [orderNumber] } },
                'acceptedOffers.itemOffered.typeOf'
            );
            const serialNumbers = await acceptedOfferRepo.distinctValues(
                { orderNumber: { $in: [orderNumber] } },
                'acceptedOffers.serialNumber'
            );
            const offeredThroughIdentifier = (<chevre.factory.service.webAPI.Identifier[]>await acceptedOfferRepo.distinctValues(
                { orderNumber: { $in: [orderNumber] } },
                'acceptedOffers.offeredThrough.identifier'
            )).shift();

            console.log('processing order', order, itemOfferedTypeOfs, serialNumbers, offeredThroughIdentifier);
            await (await chevre.service.order.createService()).processOrder({
                order: {
                    ...order,
                    itemOfferedTypeOf: itemOfferedTypeOfs[0], // 1つしかない前提
                    serialNumbers,
                    offeredThroughIdentifier
                },
                options: {
                    force: true,
                    numTryConfirmReserveTransaction: 10
                }
            })({ task: taskRepo });
            console.log('order processed', order.orderNumber);
            updateCount += 1;
            console.log('updated.', order.project.id, order.orderNumber, order.orderDate, i);
        }
    });

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

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

main()
    .then(() => {
        console.log('success!');
    })
    .catch(console.error);
