import axios from 'axios';
import moment from 'moment';
import { Message } from 'eris';
import { randomBytes } from 'crypto';
import { v4 as uuid } from 'uuid';
import { Client, Command } from '../class';
import Billing_T3 from './billing_t3';

export default class Billing extends Command {
  constructor(client: Client) {
    super(client);
    this.name = 'billing';
    this.description = 'Pulls up your Billing Portal. You must have a CS Account to continue.';
    this.usage = `${this.client.config.prefix}billing`;
    this.subcmds = [Billing_T3];
    this.permissions = 0;
    this.guildOnly = false;
    this.enabled = true;
  }

  public async run(message: Message) {
    try {
      const response = <{
        found: boolean,
        emailAddress?: string,
        tier?: number,
        supportKey?: string,
      }> (await axios.get(`https://api.cloud.libraryofcode.org/wh/info?id=${message.author.id}&authorization=${this.client.config.internalKey}`)).data;
      if (!response.found) return this.error(message.channel, 'CS Account not found.');

      const portalKey = randomBytes(50).toString('hex');
      const uid = uuid();
      const redirect = new this.client.db.Redirect({
        key: uid,
        to: `https://loc.sh/dash?q=${portalKey}`,
      });
      const portal = new this.client.db.CustomerPortal({
        key: portalKey,
        username: message.author.username,
        userID: message.author.id,
        emailAddress: response.emailAddress,
        expiresOn: moment().add(5, 'minutes').toDate(),
        used: false,
      });
      await portal.save();
      await redirect.save();

      const chan = await this.client.getDMChannel(message.author.id);
      await chan.createMessage(`__***Billing Account Portal***__\nClick here: https://loc.sh/${uid}\n\nYou will be redirected to your billing portal, please note the link expires after 5 minutes.`);
      return await this.success(message.channel, 'Your Billing Portal information has been DMed to you.');
    } catch (err) {
      return this.client.util.handleError(err, message, this);
    }
  }
}
