import React from 'react';

import {addErrorMessage, addSuccessMessage} from 'app/actionCreators/indicator';
import AsyncComponent from 'app/components/asyncComponent';
import Button from 'app/components/button';
import Confirm from 'app/components/confirm';
import {IconDelete} from 'app/icons';
import {t} from 'app/locale';
import {CodeOwners, Organization, Project} from 'app/types';
import RulesPanel from 'app/views/settings/project/projectOwnership/rulesPanel';

type Props = AsyncComponent['props'] & {
  organization: Organization;
  project: Project;
};

type State = {} & AsyncComponent['state'];

class CodeOwnersPanel extends AsyncComponent<Props, State> {
  getEndpoints(): ReturnType<AsyncComponent['getEndpoints']> {
    const {organization, project} = this.props;
    return [
      [
        'codeowners',
        `/projects/${organization.slug}/${project.slug}/codeowners/?expand=codeMapping`,
      ],
    ];
  }

  handleDelete = async (codeowner: CodeOwners) => {
    const {organization, project} = this.props;
    const endpoint = `/api/0/projects/${organization.slug}/${project.slug}/codeowners/${codeowner.id}/`;
    try {
      await this.api.requestPromise(endpoint, {
        method: 'DELETE',
      });
      // remove config and update state
      const {codeowners} = this.state;
      this.setState({
        codeowners: codeowners.filter(config => config.id !== codeowner.id),
      });
      addSuccessMessage(t('Deletion successful'));
    } catch {
      //no 4xx errors should happen on delete
      addErrorMessage(t('An error occurred'));
    }
  };

  renderBody() {
    const {codeowners} = this.state;
    return codeowners.map(codeowner => {
      const {
        raw,
        dateUpdated,
        provider,
        codeMapping: {repoName},
      } = codeowner;
      return (
        <React.Fragment key={codeowner.id}>
          <RulesPanel
            data-test-id="codeowners-panel"
            type="codeowners"
            raw={raw}
            dateUpdated={dateUpdated}
            provider={provider}
            repoName={repoName}
            readOnly
            controls={[
              <Confirm
                onConfirm={() => this.handleDelete(codeowner)}
                message={t('Are you sure you want to remove this CODEOWNERS file?')}
                key="confirm-delete"
              >
                <Button key="delete" icon={<IconDelete size="xs" />} size="xsmall" />
              </Confirm>,
            ]}
          />
        </React.Fragment>
      );
    });
  }
}

export default CodeOwnersPanel;