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

import React, { useState } from 'react';
import classNames from 'classnames';
import type { ConversationStoryType, StoryViewType } from './StoryListItem';
import type { LocalizerType } from '../types/Util';
import type { PropsType as SmartStoryViewerPropsType } from '../state/smart/StoryViewer';
import { StoriesPane } from './StoriesPane';
import { Theme, themeClassName } from '../util/theme';
import { getWidthFromPreferredWidth } from '../util/leftPaneWidth';

export type PropsType = {
  hiddenStories: Array<ConversationStoryType>;
  i18n: LocalizerType;
  preferredWidthFromStorage: number;
  openConversationInternal: (_: { conversationId: string }) => unknown;
  renderStoryViewer: (props: SmartStoryViewerPropsType) => JSX.Element;
  stories: Array<ConversationStoryType>;
  toggleHideStories: (conversationId: string) => unknown;
  toggleStoriesView: () => unknown;
};

type ViewingStoryType = {
  conversationId: string;
  stories: Array<StoryViewType>;
};

export const Stories = ({
  hiddenStories,
  i18n,
  openConversationInternal,
  preferredWidthFromStorage,
  renderStoryViewer,
  stories,
  toggleHideStories,
  toggleStoriesView,
}: PropsType): JSX.Element => {
  const [storiesToView, setStoriesToView] = useState<
    undefined | ViewingStoryType
  >();

  const width = getWidthFromPreferredWidth(preferredWidthFromStorage, {
    requiresFullWidth: true,
  });

  return (
    <div className={classNames('Stories', themeClassName(Theme.Dark))}>
      {storiesToView &&
        renderStoryViewer({
          conversationId: storiesToView.conversationId,
          onClose: () => setStoriesToView(undefined),
          onNextUserStories: () => {
            const storyIndex = stories.findIndex(
              x => x.conversationId === storiesToView.conversationId
            );
            if (storyIndex >= stories.length - 1) {
              setStoriesToView(undefined);
              return;
            }
            const nextStory = stories[storyIndex + 1];
            setStoriesToView({
              conversationId: nextStory.conversationId,
              stories: nextStory.stories,
            });
          },
          onPrevUserStories: () => {
            const storyIndex = stories.findIndex(
              x => x.conversationId === storiesToView.conversationId
            );
            if (storyIndex === 0) {
              setStoriesToView(undefined);
              return;
            }
            const prevStory = stories[storyIndex - 1];
            setStoriesToView({
              conversationId: prevStory.conversationId,
              stories: prevStory.stories,
            });
          },
          stories: storiesToView.stories,
        })}
      <div className="Stories__pane" style={{ width }}>
        <StoriesPane
          hiddenStories={hiddenStories}
          i18n={i18n}
          onBack={toggleStoriesView}
          onStoryClicked={conversationId => {
            const storyIndex = stories.findIndex(
              x => x.conversationId === conversationId
            );
            const foundStory = stories[storyIndex];

            if (foundStory) {
              setStoriesToView({
                conversationId,
                stories: foundStory.stories,
              });
            }
          }}
          openConversationInternal={openConversationInternal}
          stories={stories}
          toggleHideStories={toggleHideStories}
        />
      </div>
      <div className="Stories__placeholder">
        <div className="Stories__placeholder__stories" />
        {i18n('Stories__placeholder--text')}
      </div>
    </div>
  );
};