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

import { type ComponentProps, useState, useEffect, type JSX } from 'react';
import type { Meta } from '@storybook/react';
import { action } from '@storybook/addon-actions';

import { BackupMediaDownloadProgress } from './BackupMediaDownloadProgress.dom.tsx';
import { KIBIBYTE } from '../types/AttachmentSize.std.ts';
import { WidthBreakpoint } from './_util.std.ts';

const { i18n } = window.SignalContext;

type PropsType = ComponentProps<typeof BackupMediaDownloadProgress>;

function Template(args: PropsType): JSX.Element {
  return (
    <>
      <div style={{ width: 350 }}>
        <p>Wide</p>
        <BackupMediaDownloadProgress
          {...args}
          widthBreakpoint={WidthBreakpoint.Wide}
        />
      </div>
      <div style={{ width: 280 }}>
        <p>Medium</p>
        <BackupMediaDownloadProgress
          {...args}
          widthBreakpoint={WidthBreakpoint.Medium}
        />
      </div>
      <div style={{ width: 130 }}>
        <p>Narrow</p>
        <BackupMediaDownloadProgress
          {...args}
          widthBreakpoint={WidthBreakpoint.Narrow}
        />
      </div>
    </>
  );
}

export default {
  title: 'Components/BackupMediaDownloadProgress',
  args: {
    isPaused: false,
    isOnline: true,
    downloadedBytes: 600 * KIBIBYTE,
    totalBytes: 1000 * KIBIBYTE,
    handleClose: action('handleClose'),
    handlePause: action('handlePause'),
    handleResume: action('handleResume'),
    handleCancel: action('handleCancel'),
    i18n,
  },
} satisfies Meta<PropsType>;

export function InProgress(args: PropsType): JSX.Element {
  return <Template {...args} />;
}
export function InProgressAndOffline(args: PropsType): JSX.Element {
  return <Template {...args} isOnline={false} />;
}

export function Increasing(args: PropsType): JSX.Element {
  return <Template {...args} {...useIncreasingFractionComplete()} />;
}

export function Paused(args: PropsType): JSX.Element {
  return <Template {...args} isPaused />;
}
export function PausedAndOffline(args: PropsType): JSX.Element {
  return <Template {...args} isPaused isOnline={false} />;
}

export function Idle(args: PropsType): JSX.Element {
  return <Template {...args} isIdle />;
}

export function IdleAndOffline(args: PropsType): JSX.Element {
  return <Template {...args} isIdle isOnline={false} />;
}

export function PausedAndIdle(args: PropsType): JSX.Element {
  return <Template {...args} isPaused isIdle />;
}

export function PausedAndIdleAndOffline(args: PropsType): JSX.Element {
  return <Template {...args} isPaused isIdle isOnline={false} />;
}

export function Complete(args: PropsType): JSX.Element {
  return <Template {...args} downloadedBytes={args.totalBytes} />;
}
export function CompleteAndOffline(args: PropsType): JSX.Element {
  return (
    <Template {...args} downloadedBytes={args.totalBytes} isOnline={false} />
  );
}

function useIncreasingFractionComplete() {
  const [fractionComplete, setFractionComplete] = useState(0);
  useEffect(() => {
    if (fractionComplete >= 1) {
      return;
    }
    const timeout = setTimeout(() => {
      setFractionComplete(cur => Math.min(1, cur + 0.1));
    }, 300);
    return () => clearTimeout(timeout);
  }, [fractionComplete]);
  return { downloadedBytes: 1e10 * fractionComplete, totalBytes: 1e10 };
}
