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

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

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

async function main() {
    const redisClient = 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
    });
    await redisClient.connect();
    await mongoose.connect(<string>process.env.MONGOLAB_URI, { autoIndex: false });

    const transactionNumberRepo = await chevre.repository.TransactionNumber.createInstance({
        redisClient,
        connection: mongoose.connection
    });
    const assetTransactionRepo = await chevre.repository.AssetTransaction.createInstance(mongoose.connection);

    const { transactionNumber } = await transactionNumberRepo.publishByTimestamp({ startDate: new Date() });
    const provider: chevre.factory.reservation.IProvider = {
        id: '59d20831e53ebc2b4e774466',
        typeOf: chevre.factory.organizationType.Corporation
    };
    const reserveTransaction = await assetTransactionRepo.start<chevre.factory.assetTransactionType.Reserve>({
        project: { id: project.id, typeOf: chevre.factory.organizationType.Project },
        typeOf: chevre.factory.assetTransactionType.Reserve,
        transactionNumber,
        agent: { ...provider, name: 'sample agent name' },
        object: {
            provider,
            reservationNumber: transactionNumber,
            reservationStatus: chevre.factory.reservationStatusType.ReservationPending,
            disablePendingReservations: true,
            useHoldStockByTransactionNumber: true,
            typeOf: chevre.factory.reservationType.ReservationPackage
        },
        expires: moment()
            .add(1, 'minute')
            .toDate()
    });
    let cancelResult = await assetTransactionRepo.cancel<chevre.factory.assetTransactionType.Reserve>({
        typeOf: reserveTransaction.typeOf,
        id: reserveTransaction.id
    });
    console.log('cancelResult:', cancelResult);
    cancelResult = await assetTransactionRepo.cancel<chevre.factory.assetTransactionType.Reserve>({
        typeOf: reserveTransaction.typeOf,
        id: reserveTransaction.id
    });
    console.log('cancelResult:', cancelResult);

    let transaction = await assetTransactionRepo.findById<chevre.factory.assetTransactionType.Reserve>(
        {
            typeOf: chevre.factory.assetTransactionType.Reserve,
            id: reserveTransaction.id
        },
        ['status', 'transactionNumber', 'project', 'typeOf']
    );
    console.log('transaction:', transaction);

    transaction = await assetTransactionRepo.findByTransactionNumber<chevre.factory.assetTransactionType.Reserve>(
        {
            typeOf: chevre.factory.assetTransactionType.Reserve,
            transactionNumber
        },
        ['status']
    );
    console.log('transaction:', transaction);

}

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