// @flow

import React from 'react';
import { FormField } from 'component/common/form';
import Button from 'component/button';
import * as DAEMON_SETTINGS from 'constants/daemon_settings';
import { formatBytes } from 'util/format-bytes';
import { isTrulyANumber } from 'util/number';
import I18nMessage from 'component/i18nMessage';
const BYTES_PER_MB = 1048576;
const ENABLE_AUTOMATIC_HOSTING = false;

type Price = {
  currency: string,
  amount: number,
};

type DaemonStatus = {
  disk_space: {
    content_blobs_storage_used_mb: string,
    published_blobs_storage_used_mb: string,
    running: true,
    seed_blobs_storage_used_mb: string,
    total_used_mb: string,
  },
};

type SetDaemonSettingArg = boolean | string | number | Price;

type DaemonSettings = {
  download_dir: string,
  share_usage_data: boolean,
  max_key_fee?: Price,
  max_connections_per_download?: number,
  save_files: boolean,
  save_blobs: boolean,
  ffmpeg_path: string,
};

type Props = {
  // --- select ---
  daemonSettings: DaemonSettings,
  daemonStatus: DaemonStatus,
  // --- perform ---
  setDaemonSetting: (string, ?SetDaemonSettingArg) => void,
  cleanBlobs: () => string,
  diskSpace?: DiskSpace,
  getDaemonStatus: () => void,
};

function SettingDataHosting(props: Props) {
  const { daemonSettings, daemonStatus, setDaemonSetting, cleanBlobs, diskSpace, getDaemonStatus } = props;

  const { disk_space: blobSpace } = daemonStatus;
  const contentSpaceUsed = Number(blobSpace.content_blobs_storage_used_mb);
  const blobLimitSetting = daemonSettings[DAEMON_SETTINGS.BLOB_STORAGE_LIMIT_MB] || '0';
  const [contentBlobSpaceLimitGB, setContentBlobSpaceLimit] = React.useState(
    blobLimitSetting ? String(blobLimitSetting / 1024) : '10'
  );
  const [applying, setApplying] = React.useState(false);

  const networkSpaceUsed = Number(blobSpace.seed_blobs_storage_used_mb);
  const networkLimitSetting = daemonSettings[DAEMON_SETTINGS.NETWORK_STORAGE_LIMIT_MB] || '0';
  const [networkBlobSpaceLimitGB, setNetworkBlobSpaceLimit] = React.useState(
    networkLimitSetting ? String(networkLimitSetting / 1024) : '0'
  );

  const [unlimited, setUnlimited] = React.useState(blobLimitSetting === '0');

  React.useEffect(() => {
    getDaemonStatus();
  }, []);

  function convertGbToMb(gb) {
    return Number(gb) * 1024;
  }

  function handleContentLimitChange(gb) {
    if (gb === '') {
      setContentBlobSpaceLimit('');
    } else if (gb === '0') {
      setContentBlobSpaceLimit('0.01'); // setting 0 means unlimited.
    } else {
      if (isTrulyANumber(Number(gb))) {
        setContentBlobSpaceLimit(gb);
      }
    }
  }

  function handleNetworkLimitChange(gb) {
    if (gb === '') {
      setNetworkBlobSpaceLimit('');
    } else {
      const numberGb = Number(gb);
      if (isTrulyANumber(numberGb)) {
        setNetworkBlobSpaceLimit(gb);
      }
    }
  }

  async function handleApply() {
    setApplying(true);
    if (unlimited) {
      await setDaemonSetting(DAEMON_SETTINGS.BLOB_STORAGE_LIMIT_MB, '0');
    } else {
      await setDaemonSetting(
        DAEMON_SETTINGS.BLOB_STORAGE_LIMIT_MB,
        String(contentBlobSpaceLimitGB === '0.01' ? '1' : convertGbToMb(contentBlobSpaceLimitGB))
      );
    }
    await setDaemonSetting(
      DAEMON_SETTINGS.NETWORK_STORAGE_LIMIT_MB,
      String(convertGbToMb(Number(networkBlobSpaceLimitGB)))
    );
    await cleanBlobs();
    getDaemonStatus();
    setApplying(false);
  }

  function validHostingAmount(amountString) {
    const numberAmount = Number(amountString);
    return amountString.length && ((numberAmount && String(numberAmount)) || numberAmount === 0);
  }

  return (
    <>
      <div className={'fieldset-section'}>
        <FormField
          type="checkbox"
          name="save_blobs"
          onChange={() => setDaemonSetting('save_blobs', !daemonSettings.save_blobs)}
          checked={daemonSettings.save_blobs}
          label={__('Enable Data Hosting')}
          helper={
            diskSpace && (
              <I18nMessage
                tokens={{
                  free: formatBytes(Number(diskSpace.free) * 1024, 0),
                  total: formatBytes(Number(diskSpace.total) * 1024, 0),
                }}
              >
                %free% of %total% available
              </I18nMessage>
            )
          }
        />
      </div>
      {daemonSettings.save_blobs && (
        <div className={'fieldset-section'}>
          <FormField
            type="radio"
            name="no_hosting_limit"
            checked={unlimited}
            label={__('Unlimited View Hosting')}
            onChange={() => setUnlimited(true)}
          />
          <FormField
            type="radio"
            name="set_hosting_limit"
            checked={!unlimited}
            onChange={() => setUnlimited(false)}
            label={__('Choose View Hosting Limit')}
          />
          {!unlimited && (
            <FormField
              name="content_blob_limit_gb"
              type="number"
              min={0}
              onWheel={(e) => e.preventDefault()}
              label={__(`View Hosting Limit (GB)`)}
              onChange={(e) => handleContentLimitChange(e.target.value)}
              value={Number(contentBlobSpaceLimitGB) <= Number('0.01') ? '0' : contentBlobSpaceLimitGB}
            />
          )}
          <div className={'help'}>{`Currently using ${formatBytes(contentSpaceUsed * BYTES_PER_MB)}`}</div>
        </div>
      )}
      {daemonSettings.save_blobs && ENABLE_AUTOMATIC_HOSTING && (
        <fieldset-section>
          <FormField
            name="network_blob_limit_gb"
            type="number"
            label={__(`Automatic Hosting (GB)`)}
            onChange={(e) => handleNetworkLimitChange(e.target.value)}
            value={networkBlobSpaceLimitGB}
          />
          <div className={'help'}>{`Auto-hosting ${formatBytes(networkSpaceUsed * BYTES_PER_MB)}`}</div>
        </fieldset-section>
      )}
      <div className={'card__actions'}>
        <Button
          disabled={
            (unlimited && blobLimitSetting === '0') ||
            (!unlimited &&
              (blobLimitSetting === convertGbToMb(contentBlobSpaceLimitGB) || // &&
                // networkLimitSetting === convertGbToMb(networkBlobSpaceLimitGB)
                !validHostingAmount(String(contentBlobSpaceLimitGB)))) ||
            applying
          }
          type="button"
          button="primary"
          onClick={handleApply}
          label={__('Apply')}
        />
      </div>
    </>
  );
}

export default SettingDataHosting;