import Customer from "discourse/plugins/discourse-subscriptions/discourse/models/customer";
import Payment from "discourse/plugins/discourse-subscriptions/discourse/models/payment";
import Subscription from "discourse/plugins/discourse-subscriptions/discourse/models/subscription";
import computed from "discourse-common/utils/decorators";

export default Ember.Controller.extend({
  planTypeIsSelected: true,

  @computed("planTypeIsSelected")
  type(planTypeIsSelected) {
    return planTypeIsSelected ? "plans" : "payment";
  },

  @computed("type")
  buttonText(type) {
    return I18n.t(`discourse_subscriptions.${type}.payment_button`);
  },

  init() {
    this._super(...arguments);
    this.set(
      "paymentsAllowed",
      Discourse.SiteSettings.discourse_subscriptions_allow_payments
    );
    this.set(
      "stripe",
      Stripe(Discourse.SiteSettings.discourse_subscriptions_public_key)
    );
    const elements = this.get("stripe").elements();

    this.set("cardElement", elements.create("card", { hidePostalCode: true }));
  },

  alert(path) {
    bootbox.alert(I18n.t(`discourse_subscriptions.${path}`));
  },

  createPayment(plan) {
    return this.stripe
      .createPaymentMethod("card", this.get("cardElement"))
      .then(result => {
        const payment = Payment.create({
          payment_method: result.paymentMethod.id,
          amount: plan.get("amount"),
          currency: plan.get("currency")
        });

        return payment.save();
      });
  },

  createSubscription(plan) {
    return this.stripe.createToken(this.get("cardElement")).then(result => {
      if (result.error) {
        return result;
      } else {
        const customer = Customer.create({ source: result.token.id });

        return customer.save().then(c => {
          const subscription = Subscription.create({
            customer: c.id,
            plan: plan.get("id")
          });

          return subscription.save();
        });
      }
    });
  },

  actions: {
    stripePaymentHandler() {
      this.set("loading", true);
      const type = this.get("type");
      const plan = this.get("model.plans")
        .filterBy("selected")
        .get("firstObject");

      if (!plan) {
        this.alert(`${type}.validate.payment_options.required`);
        this.set("loading", false);
        return;
      }

      let transaction;

      if (this.planTypeIsSelected) {
        transaction = this.createSubscription(plan);
      } else {
        transaction = this.createPayment(plan);
      }

      transaction
        .then(result => {
          if (result.error) {
            bootbox.alert(result.error.message || result.error);
          } else {
            if (result.status === "incomplete") {
              this.alert(`${type}.incomplete`);
            } else {
              this.alert(`${type}.success`);
            }

            const success_route = this.planTypeIsSelected
              ? "user.billing.subscriptions"
              : "user.billing.payments";

            this.transitionToRoute(
              success_route,
              Discourse.User.current().username.toLowerCase()
            );
          }
        })
        .catch(result => {
          bootbox.alert(result.errorThrown);
        })
        .finally(() => {
          this.set("loading", false);
        });
    }
  }
});
