// @flow
import 'scss/component/_comment-selectors.scss';

import { EMOTES_48px as EMOTES } from 'constants/emotes';
import * as ICONS from 'constants/icons';
import Button from 'component/button';
import CreditAmount from 'component/common/credit-amount';
import React from 'react';
import { Tabs, TabList, Tab, TabPanels, TabPanel } from 'component/common/tabs';
import { FREE_GLOBAL_STICKERS, PAID_GLOBAL_STICKERS } from 'constants/stickers';

export const SELECTOR_TABS = {
  EMOJI: 0,
  STICKER: 1,
};

type Props = {
  claimIsMine?: boolean,
  openTab?: number,
  addEmoteToComment: (string) => void,
  handleSelectSticker: (any) => void,
  closeSelector?: () => void,
};

export default function CommentSelectors(props: Props) {
  const { claimIsMine, openTab, addEmoteToComment, handleSelectSticker, closeSelector } = props;

  const tabProps = { closeSelector };

  return (
    <Tabs index={openTab}>
      <TabList className="tabs__list--comment-selector">
        <Tab>{__('Emojis')}</Tab>
        <Tab>{__('Stickers')}</Tab>
      </TabList>

      <TabPanels>
        <TabPanel>
          <EmojisPanel handleSelect={(emote) => addEmoteToComment(emote)} {...tabProps} />
        </TabPanel>

        <TabPanel>
          <StickersPanel
            handleSelect={(sticker) => handleSelectSticker(sticker)}
            claimIsMine={claimIsMine}
            {...tabProps}
          />
        </TabPanel>
      </TabPanels>
    </Tabs>
  );
}

type EmojisProps = {
  handleSelect: (emoteName: string) => void,
  closeSelector: () => void,
};

const EmojisPanel = (emojisProps: EmojisProps) => {
  const { handleSelect, closeSelector } = emojisProps;

  return (
    <div className="selector-menu">
      <Button button="close" icon={ICONS.REMOVE} onClick={closeSelector} />

      <div className="emote-selector__items">
        {EMOTES.map((emote) => {
          const { name, url } = emote;

          return (
            <Button
              key={name}
              title={name}
              button="alt"
              className="button--file-action"
              onClick={() => handleSelect(name)}
            >
              <img src={url} loading="lazy" />
            </Button>
          );
        })}
      </div>
    </div>
  );
};

type StickersProps = {
  claimIsMine: any,
  handleSelect: (any) => void,
  closeSelector: () => void,
};

const StickersPanel = (stickersProps: StickersProps) => {
  const { claimIsMine, handleSelect, closeSelector } = stickersProps;

  const defaultRowProps = { handleSelect };

  return (
    <div className="selector-menu--stickers">
      <Button button="close" icon={ICONS.REMOVE} onClick={closeSelector} />

      <StickersRow title={__('Free')} stickers={FREE_GLOBAL_STICKERS} {...defaultRowProps} />
      {!claimIsMine && <StickersRow title={__('Tips')} stickers={PAID_GLOBAL_STICKERS} {...defaultRowProps} />}
    </div>
  );
};

type RowProps = {
  title: string,
  stickers: any,
  handleSelect: (string) => void,
};

const StickersRow = (rowProps: RowProps) => {
  const { title, stickers, handleSelect } = rowProps;

  return (
    <div className="sticker-selector__body-row">
      <label id={title} className="sticker-selector__row-title">
        {title}
      </label>

      <div className="sticker-selector__items">
        {stickers.map((sticker) => {
          const { price, url, name } = sticker;

          return (
            <Button
              key={name}
              title={name}
              button="alt"
              className="button--file-action"
              onClick={() => handleSelect(sticker)}
            >
              <StickerWrapper price={price}>
                <img src={url} loading="lazy" />
                {price && price > 0 && <CreditAmount superChatLight amount={price} size={2} isFiat />}
              </StickerWrapper>
            </Button>
          );
        })}
      </div>
    </div>
  );
};

type StickerProps = {
  price?: number,
  children: any,
};

const StickerWrapper = (stickerProps: StickerProps) => {
  const { price, children } = stickerProps;

  return price ? <div className="sticker-item--priced">{children}</div> : children;
};