import { get, computed } from '@ember/object';
import { inject as service } from '@ember/service';
import Resource from '@rancher/ember-api-store/models/resource';
import C from 'ui/utils/constants';

export default Resource.extend({
  router:              service(),
  roleTemplateService: service('roleTemplate'),
  growl:               service(),

  type:     'roleTemplate',
  canClone: true,

  state: computed('locked', function() {
    return get(this, 'locked') ? 'locked' : 'active';
  }),

  isCustom: computed('roleTemplateId', function() {
    return !C.BASIC_ROLE_TEMPLATE_ROLES.includes(get(this, 'id'));
  }),

  displayName: computed('name', 'id', function() {
    let name = get(this, 'name');

    if ( name ) {
      return name;
    }

    return `(${  get(this, 'id')  })`;
  }),

  canRemove: computed('links.remove', 'builtin', function() {
    return !!get(this, 'links.remove') && !get(this, 'builtin');
  }),
  actions: {
    edit() {
      get(this, 'router').transitionTo('global-admin.security.roles.edit', get(this, 'id'));
    },

    clone() {
      get(this, 'router').transitionTo('global-admin.security.roles.new', { queryParams: { id: get(this, 'id'),  } });
    }
  },

  delete() {
    const self = this;
    const sup = self._super;
    const roleTemplateService = get(this, 'roleTemplateService')
    let canDelete = true
    const roleNames = []

    return roleTemplateService.fetchFilteredRoleTemplates().then((res) => {
      const roleTemplates = res.filter((r) => r.canRemove)

      roleTemplates.map((r) => {
        const { roleTemplateIds = [] } = r

        roleTemplateIds.map((id) => {
          if (id === this.id) {
            canDelete = false
            roleNames.pushObject(r.name)
          }
        })
      })

      if (canDelete) {
        return sup.apply(self, arguments);
      } else {
        return get(this, 'growl').error(get(this, 'intl').t('rolesPage.index.errors.inherited', {
          displayName: get(this, 'displayName'),
          roleNames:   roleNames.join(','),
        }));
      }
    })
  },

});
