# Wrapper for actions provided by ngResource
# Used to extend the prototype of the subscription resource created by SubscriptionResource

angular.module("admin.subscriptions").factory 'SubscriptionActions', ($http, $injector, $q, InfoDialog, ConfirmDialog) ->
  buildItem: (item) ->
    return false unless item.variant_id > 0
    return false unless item.quantity > 0
    data = angular.extend({}, item, { shop_id: @shop_id, schedule_id: @schedule_id })
    $http.post("/admin/subscription_line_items/build", data).then (response) =>
      @subscription_line_items.push response.data
    , (response) =>
      InfoDialog.open 'error', response.data.errors[0]

  removeItem: (item) ->
    item._destroy = true

  create: ->
    @$save().then (response) =>
      $injector.get('Subscriptions').afterCreate(@id) if $injector.has('Subscriptions')
      $q.resolve(response)
    , (response) => $q.reject(response)

  update: ->
    @$update().then (response) =>
      $injector.get('Subscriptions').afterUpdate(@id) if $injector.has('Subscriptions')
      orders_with_issues = @not_closed_proxy_orders.filter((po) -> po.update_issues.length > 0)
      if orders_with_issues.length > 0
        InfoDialog.open('error', null, 'admin/order_update_issues_dialog.html', { proxyOrders: orders_with_issues})
        return $q.reject(response)
      $q.resolve(response)
    , (response) => $q.reject(response)

  cancel: ->
    ConfirmDialog.open('error', t('admin.subscriptions.confirm_cancel_msg'), {cancel: t('back'), confirm: t('admin.subscriptions.yes_i_am_sure')})
    .then =>
      @$cancel().then angular.noop, (response) =>
        if response.data?.errors?.open_orders?
          options = {cancel: t('admin.subscriptions.no_keep_them'), confirm: t('admin.subscriptions.yes_cancel_them')}
          ConfirmDialog.open('error', response.data.errors.open_orders, options)
          .then (=> @$cancel(open_orders: 'cancel')), (=> @$cancel(open_orders: 'keep'))
        else
          InfoDialog.open 'error', t('admin.subscriptions.cancel_failure_msg')

  pause: ->
    ConfirmDialog.open('error', t('admin.subscriptions.confirm_pause_msg'), {confirm: t('admin.subscriptions.yes_i_am_sure')})
    .then =>
      @$pause().then angular.noop, (response) =>
        if response.data?.errors?.open_orders?
          options = {cancel: t('admin.subscriptions.no_keep_them'), confirm: t('admin.subscriptions.yes_cancel_them')}
          ConfirmDialog.open('error', response.data.errors.open_orders, options)
          .then (=> @$pause(open_orders: 'cancel')), (=> @$pause(open_orders: 'keep'))
        else
          InfoDialog.open 'error', t('admin.subscriptions.pause_failure_msg')

  unpause: ->
    ConfirmDialog.open('error', t('admin.subscriptions.confirm_unpause_msg'), {confirm: t('admin.subscriptions.yes_i_am_sure')})
    .then =>
      @$unpause().then angular.noop, (response) =>
        if response.data?.errors?.canceled_orders?
          InfoDialog.open('info', response.data.errors.canceled_orders)
            .then (=> @$unpause(canceled_orders: 'notified'))
        else
          InfoDialog.open 'error', t('admin.subscriptions.unpause_failure_msg')

  cancelOrder: (order) ->
    if order.id?
      $http.put("/admin/proxy_orders/#{order.id}/cancel").then (response) =>
        angular.extend(order,response.data)
      , (response) ->
        InfoDialog.open 'error', response.data.errors[0]

  resumeOrder: (order) ->
    if order.id?
      $http.put("/admin/proxy_orders/#{order.id}/resume").then (response) =>
        angular.extend(order,response.data)
      , (response) ->
        InfoDialog.open 'error', response.data.errors[0]
