// @flow
import * as ICONS from 'constants/icons';
import * as PAGES from 'constants/pages';
import * as React from 'react';

import Page from 'component/page';
import { FormField } from 'component/common/form';
import Card from 'component/common/card';
import SettingsRow from 'component/settingsRow';
import { Lbryio } from 'lbryinc';
import { useHistory } from 'react-router';
import { Redirect } from 'react-router-dom';
import Yrbl from 'component/yrbl';
import Button from 'component/button';
import { SETTINGS } from 'lbry-redux';

type Props = {
  osNotificationsEnabled: boolean,
  isAuthenticated: boolean,
  setClientSetting: (string, boolean) => void,
};

export default function NotificationSettingsPage(props: Props) {
  const { osNotificationsEnabled, setClientSetting, isAuthenticated } = props;
  const [error, setError] = React.useState();
  const [tagMap, setTagMap] = React.useState({});
  const [tags, setTags] = React.useState();
  const [enabledEmails, setEnabledEmails] = React.useState();
  const { location } = useHistory();
  const urlParams = new URLSearchParams(location.search);
  const verificationToken = urlParams.get('verification_token');
  const lbryIoParams = verificationToken ? { auth_token: verificationToken } : undefined;

  React.useEffect(() => {
    Lbryio.call('tag', 'list', lbryIoParams)
      .then(setTags)
      .catch((e) => {
        setError(true);
      });

    Lbryio.call('user_email', 'status', lbryIoParams)
      .then((res) => {
        const enabledEmails =
          res.emails &&
          Object.keys(res.emails).reduce((acc, email) => {
            const isEnabled = res.emails[email];
            return [...acc, { email, isEnabled }];
          }, []);

        setTagMap(res.tags);
        setEnabledEmails(enabledEmails);
      })
      .catch((e) => {
        setError(true);
      });
  }, []);

  function handleChangeTag(name, newIsEnabled) {
    const tagParams = newIsEnabled ? { add: name } : { remove: name };

    Lbryio.call('user_tag', 'edit', { ...lbryIoParams, ...tagParams }).then(() => {
      const newTagMap = { ...tagMap };
      newTagMap[name] = newIsEnabled;

      setTagMap(newTagMap);
    });
  }

  function handleChangeEmail(email, newIsEnabled) {
    Lbryio.call('user_email', 'edit', {
      email: email,
      enabled: newIsEnabled,
      ...lbryIoParams,
    })
      .then(() => {
        const newEnabledEmails = enabledEmails
          ? enabledEmails.map((userEmail) => {
              if (email === userEmail.email) {
                return { email, isEnabled: newIsEnabled };
              }

              return userEmail;
            })
          : [];

        setEnabledEmails(newEnabledEmails);
      })
      .catch((e) => {
        setError(true);
      });
  }

  if (IS_WEB && !isAuthenticated && !verificationToken) {
    return <Redirect to={`/$/${PAGES.AUTH_SIGNIN}?redirect=${location.pathname}`} />;
  }

  return (
    <Page
      noFooter
      noSideNavigation
      settingsPage
      className="card-stack"
      backout={{ title: __('Manage notifications'), backLabel: __('Back') }}
    >
      {error ? (
        <Yrbl
          type="sad"
          title={__('Uh oh')}
          subtitle={__('There was an error displaying this page.')}
          actions={
            <div className="section__actions">
              <Button
                button="secondary"
                label={__('Refresh')}
                icon={ICONS.REFRESH}
                onClick={() => window.location.reload()}
              />
              <Button button="secondary" label={__('Go Home')} icon={ICONS.HOME} navigate={'/'} />
            </div>
          }
        />
      ) : (
        <div className="card-stack">
          {/* @if TARGET='app' */}
          <div>
            <h2 className="card__title">{__('App notifications')}</h2>
            <div className="card__subtitle">{__('Notification settings for the desktop app.')}</div>
          </div>
          <Card
            isBodyList
            body={
              <SettingsRow
                title={__('Show Desktop Notifications')}
                subtitle={__('Get notified when an upload or channel is confirmed.')}
              >
                <FormField
                  type="checkbox"
                  name="desktopNotification"
                  onChange={() => setClientSetting(SETTINGS.OS_NOTIFICATIONS_ENABLED, !osNotificationsEnabled)}
                  checked={osNotificationsEnabled}
                />
              </SettingsRow>
            }
          />
          {/* @endif */}

          {enabledEmails && enabledEmails.length > 0 && (
            <>
              <div>
                <h2 className="card__title">
                  {enabledEmails.length === 1 ? __('Your email') : __('Receiving addresses')}
                </h2>
                <div className="card__subtitle">
                  {__('Uncheck your email below if you want to stop receiving messages.')}
                </div>
              </div>
              <Card
                isBodyList
                body={
                  <>
                    {enabledEmails.map(({ email, isEnabled }) => (
                      <SettingsRow key={email} subtitle={__(email)}>
                        <FormField
                          type="checkbox"
                          name={`active-email:${email}`}
                          key={email}
                          onChange={() => handleChangeEmail(email, !isEnabled)}
                          checked={isEnabled}
                        />
                      </SettingsRow>
                    ))}
                  </>
                }
              />
            </>
          )}

          {tags && tags.length > 0 && (
            <>
              <div>
                <h2 className="card__title">{__('Email preferences')}</h2>
                <div className="card__subtitle">
                  {__("Opt out of any topics you don't want to receive email about.")}
                </div>
              </div>
              <Card
                isBodyList
                body={
                  <>
                    {tags.map((tag) => {
                      const isEnabled = tagMap[tag.name];
                      return (
                        <SettingsRow key={tag.name} subtitle={__(tag.description)}>
                          <FormField
                            type="checkbox"
                            key={tag.name}
                            name={tag.name}
                            onChange={() => handleChangeTag(tag.name, !isEnabled)}
                            checked={isEnabled}
                          />
                        </SettingsRow>
                      );
                    })}
                  </>
                }
              />
            </>
          )}
        </div>
      )}
    </Page>
  );
}