// Copyright 2020 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only

import * as React from 'react';
import { action } from '@storybook/addon-actions';
import type { Meta } from '@storybook/react';
import { MessageRequestActions } from './MessageRequestActions.dom.tsx';
import {
  getDefaultConversation,
  getDefaultGroup,
} from '../../test-helpers/getDefaultConversation.std.ts';

const { i18n } = window.SignalContext;

type Args = {
  conversationType: 'direct' | 'group';
  isBlocked: boolean;
  isHidden: boolean;
  isReported: boolean;
};

export default {
  title: 'Components/Conversation/MessageRequestActions',
  argTypes: {
    conversationType: {
      control: {
        type: 'select',
        options: ['direct', 'group'],
      },
    },
  },
  args: {
    conversationType: 'direct',
  },
  decorators: [
    (Story: React.ComponentType): React.JSX.Element => {
      return (
        <div style={{ width: '480px' }}>
          <Story />
        </div>
      );
    },
  ],
} satisfies Meta<Args>;

function Example(args: Args): React.JSX.Element {
  const conversation =
    args.conversationType === 'group'
      ? getDefaultGroup()
      : getDefaultConversation();
  const addedBy =
    args.conversationType === 'group' ? getDefaultConversation() : conversation;
  return (
    <MessageRequestActions
      addedByName={addedBy}
      conversationType={conversation.type}
      conversationId={conversation.id}
      conversationName={conversation}
      i18n={i18n}
      isBlocked={args.isBlocked}
      isHidden={args.isHidden}
      isReported={args.isReported}
      getSharedGroupNames={() => []}
      acceptConversation={action('acceptConversation')}
      blockAndReportSpam={action('blockAndReportSpam')}
      blockConversation={action('blockConversation')}
      deleteConversation={action('deleteConversation')}
      reportSpam={action('reportSpam')}
    />
  );
}

export function Direct(args: Args): React.JSX.Element {
  return <Example {...args} />;
}

export function DirectBlocked(args: Args): React.JSX.Element {
  return <Example {...args} isBlocked />;
}

export function DirectReported(args: Args): React.JSX.Element {
  return <Example {...args} isReported />;
}

export function DirectBlockedAndReported(args: Args): React.JSX.Element {
  return <Example {...args} isBlocked isReported />;
}

export function Group(args: Args): React.JSX.Element {
  return <Example {...args} conversationType="group" />;
}

export function GroupBlocked(args: Args): React.JSX.Element {
  return <Example {...args} conversationType="group" isBlocked />;
}

export function GroupReported(args: Args): React.JSX.Element {
  return <Example {...args} conversationType="group" isReported />;
}

export function GroupBlockedAndReported(args: Args): React.JSX.Element {
  return <Example {...args} conversationType="group" isBlocked isReported />;
}
