// tslint:disable:no-console
import * as moment from 'moment-timezone';
import * as mongoose from 'mongoose';
import * as redis from 'redis';
import { PendingReservationRepo } from '../../../../lib/chevre/repo/pendingReservation';
// import { chevre } from '../../../../lib/index';

mongoose.Model.on('index', (...args) => {
    console.error('******** index event emitted. ********\n', args);
});

const today = moment()
    .tz('Asia/Tokyo')
    .format('YYYYMMDD');
const project = { id: String(process.env.PROJECT_ID) };
const eventId = `sampleEventId${today}:03`;
// const eventId = 'bma1pcxs0';
const eventStartDate = new Date('2025-05-01T00:00:00Z');
// const seatSection = 'SampleSectionNameXXXXXXXXXXXXXXXXXXX';
const seatSection = 'Default';
// tslint:disable-next-line:no-magic-numbers prefer-array-literal
const allSeatNumbers = [...Array(10000)].map((__, seatKey) => `SampleSeatNumber-${seatKey}`);
// const allSeatNumbers = [...Array(10000)].map((__, seatKey) => `A-${seatKey}`);

const client = redis.createClient<redis.RedisDefaultModules, Record<string, never>, Record<string, never>>({
    socket: {
        port: Number(<string>process.env.REDIS_PORT),
        host: <string>process.env.REDIS_HOST
    },
    password: <string>process.env.REDIS_KEY
})
    .on('error', (err) => {
        // eslint-disable-next-line no-console
        console.error('createDefaultRedisClient: client onError:', err);
        // reject(err);
    });
client.connect();
mongoose.connect(<string>process.env.MONGOLAB_URI, { autoIndex: false });

const formatter = new Intl.NumberFormat('ja-JP');

// tslint:disable-next-line:max-func-body-length
async function main() {
    let startTime: [number, number] = process.hrtime();
    let diff: [number, number] = process.hrtime(startTime);
    let result: any;

    // const stockHolderRepo = await chevre.repository.StockHolder.createInstance(client, mongoose.connection);
    const pendingReservationRepo = new PendingReservationRepo(mongoose.connection);

    result = await pendingReservationRepo.countUnavailableOffers({
        project: { id: project.id },
        event: {
            id: eventId,
            startDate: eventStartDate,
            hasTicketedSeat: true
        }
    });
    console.log('countUnavailableOffersResult:', result);

    startTime = process.hrtime();
    const searchHoldersResult = await pendingReservationRepo.searchHolders({
        project: { id: project.id },
        eventId,
        startDate: eventStartDate,
        hasTicketedSeat: true,
        offers: [
            // tslint:disable-next-line:no-magic-numbers
            ...allSeatNumbers.slice(0, 10)
                .map((seatNumber) => ({ seatSection, seatNumber }))
            // { seatSection, seatNumber: 'SampleSeatNumber-7341' }
        ]
    });
    diff = process.hrtime(startTime);
    console.log('searchHoldersResult:', searchHoldersResult, searchHoldersResult.length);
    console.log('diff:', [diff[0], formatter.format(diff[1])]);

    // startTime = process.hrtime();
    // const searchHolders2Result = await pendingReservationRepo.searchHolders2({
    //     project: { id: project.id },
    //     eventId,
    //     startDate: eventStartDate,
    //     hasTicketedSeat: true,
    //     offers: [
    //         // tslint:disable-next-line:no-magic-numbers
    //         ...allSeatNumbers.slice(0, 10)
    //             .map((seatNumber) => ({ seatSection, seatNumber }))
    //     ]
    // });
    // diff = process.hrtime(startTime);
    // console.log('searchHolders2:', searchHolders2Result, searchHolders2Result.length);
    // console.log('diff:', [diff[0], formatter.format(diff[1])]);
}

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