// Copyright 2021 99cloud
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

import { inject, observer } from 'mobx-react';
import { ModalAction } from 'containers/Action';
import globalCredentialStore from 'stores/keystone/credential';
import moment from 'moment';
import globalRootStore from 'stores/root';
import { toJS } from 'mobx';
import FileSaver from 'file-saver';

export class Create extends ModalAction {
  static id = 'create-application_credentials';

  static title = t('Create Application Credentials');

  static get modalSize() {
    return 'middle';
  }

  getModalSize() {
    return 'middle';
  }

  get name() {
    return t('Create Application Credentials');
  }

  onSubmit = (values) => {
    if (values.expires_at) {
      values.expires_at = values.expires_at.clone().endOf('day');
    }
    if (values.roles) {
      values.roles = Object.keys(values.roles)
        .filter((key) => values.roles[key])
        .map((i) => ({ id: i }));
    }
    return globalCredentialStore.create(values).then((res) => {
      const { links, roles, system, unrestricted, user_id, name, ...rest } =
        res.application_credential;
      const filename = `${name}.json`;
      const blob = new Blob([JSON.stringify(rest, null, 2)], {
        type: 'text/plain;charset=utf-8',
      });
      FileSaver.saveAs(blob, filename);
    });
  };

  static allowed() {
    return Promise.resolve(true);
  }

  static policy = 'identity:create_application_credential';

  get roleOptions() {
    const roles = toJS(globalRootStore.roles);

    return roles.map((i) => ({
      label: i.name,
      value: i.id,
    }));
  }

  get formItems() {
    return [
      {
        name: 'name',
        label: t('Name'),
        type: 'input-name',
        required: true,
      },
      {
        name: 'expires_at',
        label: t('Expires At'),
        type: 'date-picker',
        showToday: false,
        disabledDate: (current) =>
          current && current < moment().subtract(1, 'days').endOf('d'),
        required: false,
      },
      {
        name: 'roles',
        label: t('Roles'),
        type: 'check-group',
        options: this.roleOptions,
        extra: t(
          'If not provided, the roles assigned to the application credential will be the same as the roles in the current token.'
        ),
        span: 12,
      },
      {
        name: 'description',
        label: t('Description'),
        type: 'textarea',
        required: false,
      },
    ];
  }
}

export default inject('rootStore')(observer(Create));
