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

import React from 'react';
import classNames from 'classnames';

import { getClassNamesFor } from '../util/getClassNamesFor';

export const SpinnerSvgSizes = ['small', 'normal'] as const;
export type SpinnerSvgSize = typeof SpinnerSvgSizes[number];

export const SpinnerDirections = [
  'outgoing',
  'incoming',
  'on-background',
  'on-captcha',
  'on-progress-dialog',
  'on-avatar',
] as const;
export type SpinnerDirection = typeof SpinnerDirections[number];

export type Props = {
  ariaLabel?: string;
  direction?: SpinnerDirection;
  moduleClassName?: string;
  role?: string;
  size?: string;
  svgSize: SpinnerSvgSize;
};

export const Spinner = ({
  ariaLabel,
  direction,
  moduleClassName,
  role,
  size,
  svgSize,
}: Props): JSX.Element => {
  const getClassName = getClassNamesFor('module-spinner', moduleClassName);

  return (
    <div
      className={classNames(
        getClassName('__container'),
        getClassName(`__container--${svgSize}`),
        getClassName(direction && `__container--${direction}`),
        getClassName(direction && `__container--${svgSize}-${direction}`)
      )}
      role={role}
      aria-label={ariaLabel}
      style={{
        height: size,
        width: size,
      }}
    >
      <div
        className={classNames(
          getClassName('__circle'),
          getClassName(`__circle--${svgSize}`),
          getClassName(direction && `__circle--${direction}`),
          getClassName(direction && `__circle--${svgSize}-${direction}`)
        )}
      />
      <div
        className={classNames(
          getClassName('__arc'),
          getClassName(`__arc--${svgSize}`),
          getClassName(direction && `__arc--${direction}`),
          getClassName(direction && `__arc--${svgSize}-${direction}`)
        )}
      />
    </div>
  );
};