import React, { useRef, useState, useEffect } from 'react';
import {useHistory} from 'react-router-dom';
import { Form, FormGroup, Input, Label, Card, CardBody, Button, Row, Col } from 'reactstrap';
import FalconCardHeader from '../common/FalconCardHeader';
import JKTooltip from '../common/JKTooltip';
import { useTranslation } from 'react-i18next';
import { useAuth } from '../../context/UserAuth';
import JKFriendsAutoComplete from '../people/JKFriendsAutoComplete';
import JKSessionInviteesChips from '../people/JKSessionInviteesChips';
import { getFriends } from '../../helpers/rest';
import JKModalDialog from '../common/JKModalDialog';
import useNativeAppCheck from '../../hooks/useNativeAppCheck';
import { useNativeApp } from '../../context/NativeAppContext';
import { useResponsive } from '@farfetch/react-context-responsive';
import { sessionPrivacyMap } from '../../config';
import JKAppLaunch from './JKAppLaunch';

const JKNewMusicSession = () => {
  const { currentUser } = useAuth();
  const { t } = useTranslation();
  const [friends, setFriends] = useState([]);
  const [isFriendsFetched, setIsFriendsFetched] = useState(false);
  const [description, setDescription] = useState('');
  const [invitees, setInvitees] = useState([]);
  const [privacy, setPrivacy] = useState('1');
  const [submitted, setSubmitted] = useState(false);
  const [showAppLauncher, setShowAppLauncher] = useState(false);
  const [customQueryString, setCustomQueryString] = useState(null);
  //const history = useHistory();
  const formRef = useRef();
  const isNativeAppAvailable = useNativeAppCheck();
  const { nativeAppUnavailable, setNativeAppUnavailable } = useNativeApp();
  const { greaterThan } = useResponsive();

  useEffect(() => {
    fetchFriends();
  }, []);

  useEffect(() => {
    if (isFriendsFetched) {
      populateFormDataFromLocalStorage();
    }
  }, [isFriendsFetched]);

  const fetchFriends = () => {
    getFriends(currentUser.id)
      .then(resp => {
        if (resp.ok) {
          return resp.json();
        }
      })
      .then(data => {
        setFriends(data);
        setIsFriendsFetched(true);
      });
  };

  const populateFormDataFromLocalStorage = () => {
    try {
      const formData = localStorage.getItem('formData');
      if (formData) {
        const formDataItems = JSON.parse(formData);
        setDescription(formDataItems['description']);
        setPrivacy(formDataItems['privacy']);
        const inviteeIds = formDataItems['inviteeIds'];
        const invitees = friends.filter(f => inviteeIds.includes(f.id));
        updateSessionInvitations(invitees);
      }
    } catch (error) {
      console.error('localStorage is not available', error);
    }
  };

  const handleSubmit = async event => {
    event.preventDefault();
    setSubmitted(true);
    const formData = new FormData(event.target);
    const payload = {
      privacy: formData.get('privacy'),
      description: formData.get('description'),
      inviteeIds: invitees.map(i => i.id).join()
    };
    try {
      //store this payload in localstorage.
      localStorage.setItem('formData', JSON.stringify(payload));
    } catch (error) {
      console.error('localStorage is not available', error);
    }
    try {
      //check if jamkazam app is installed
      await isNativeAppAvailable();
      const q = `privacy~${payload.privacy}|description~${payload.description}|inviteeIds~${payload.inviteeIds}`;
      setCustomQueryString(`act=createSession&p=${q}`);
      //history.push(`/applaunch?act=createSession&p=${q}`);
      
    } catch (error) {
      toggleAppUnavilableModel();
    }
    return false;
  };

  useEffect(() => {
    if (customQueryString) {
      setShowAppLauncher(true);
    }
  }, [customQueryString]);

  const handleOnSelect = submittedItems => {
    updateSessionInvitations(submittedItems);
  };

  const updateSessionInvitations = submittedInvitees => {
    const updatedInvitees = Array.from(new Set([...invitees, ...submittedInvitees]));
    setInvitees(updatedInvitees);

    const friendIds = submittedInvitees.map(si => si.id);
    const updatedFriends = friends.filter(f => !friendIds.includes(f.id));
    setFriends(updatedFriends);
  };

  const removeInvitee = invitee => {
    const updatedInvitees = invitees.filter(i => i.id !== invitee.id);
    setInvitees(updatedInvitees);
    const updatedFriends = [...friends, invitee];
    setFriends(updatedFriends);
  };

  const toggleAppUnavilableModel = () => {
    setNativeAppUnavailable(prev => !prev);
    if (!nativeAppUnavailable) {
      setSubmitted(false);
    }
  };

  const toggleAppLauncher = () => {
    setShowAppLauncher(prev => !prev);
  }

  return (
    <div>
      <Card>
        <FalconCardHeader title={t('new.page_title', { ns: 'sessions' })} titleClass="font-weight-bold" />
        <CardBody className="pt-0">
          <Row>
            <Col>
              <Form onSubmit={handleSubmit} ref={formRef}>
                <FormGroup className="mb-3">
                  <Label>
                    {t('new.privacy', { ns: 'sessions' })}{' '}
                    <JKTooltip title={t('new.privacy_help', { ns: 'sessions' })} />
                  </Label>
                  <Input
                    type="select"
                    aria-label="Session Privacy"
                    name="privacy"
                    value={privacy}
                    onChange={e => setPrivacy(e.target.value)}
                    data-testid="session-privacy"
                  >
                    <option value={sessionPrivacyMap['public']}>{t('new.privacy_opt_public', { ns: 'sessions' })}</option>
                    <option value={sessionPrivacyMap['private_invite']}>
                      {t('new.privacy_opt_private_invite', { ns: 'sessions' })}
                    </option>
                    <option value={sessionPrivacyMap['private_approve']}>
                      {t('new.privacy_opt_private_approve', { ns: 'sessions' })}
                    </option>
                  </Input>
                </FormGroup>

                <FormGroup className="mb-3">
                  <Label>
                    {t('new.invitations', { ns: 'sessions' })}{' '}
                    <JKTooltip title={t('new.invitations_help', { ns: 'sessions' })} />
                  </Label>
                  <JKFriendsAutoComplete friends={friends} onSelect={handleOnSelect} />
                  {invitees.length > 0 && <JKSessionInviteesChips invitees={invitees} removeInvitee={removeInvitee} />}
                </FormGroup>
                <FormGroup className="mb-3">
                  <Label>
                    {t('new.description', { ns: 'sessions' })}{' '}
                    <JKTooltip title={t('new.description_help', { ns: 'sessions' })} />
                  </Label>
                  <Input
                    value={description}
                    onChange={e => setDescription(e.target.value)}
                    name="description"
                    type="textarea"
                    data-testid="session-description"
                    placeholder={t('new.description_placeholder', { ns: 'sessions' })}
                  />
                </FormGroup>

                <FormGroup className="mb-3">
                  <Button color="primary" data-testid="btn-create-session" disabled={submitted}>
                    {t('new.create_session', { ns: 'sessions' })}
                  </Button>
                </FormGroup>
              </Form>
            </Col>
            { greaterThan.lg && (
               <Col />
            )}
           
          </Row>
        </CardBody>
      </Card>
      <JKModalDialog
        show={nativeAppUnavailable}
        onToggle={toggleAppUnavilableModel}
        title={t('modals.native_app_unavailable.title', { ns: 'common' })}
      >
        <p>{t('modals.native_app_unavailable.body', { ns: 'common' })}</p>
        <div className="d-flex flex-row">
          <a
            href="https://www.jamkazam.com/downloads"
            onClick={() => toggleAppUnavilableModel()}
            target="_blank"
            className="btn btn-primary mr-2"
          >
            {t('modals.native_app_unavailable.download_button', { ns: 'common' })}
          </a>
          <a
            href="https://www.jamkazam.com/help_desk"
            onClick={() => toggleAppUnavilableModel()}
            target="_blank"
            className="btn btn-light"
          >
            {t('modals.native_app_unavailable.help_button', { ns: 'common' })}
          </a>
        </div>
      </JKModalDialog>
      <JKModalDialog
        show={showAppLauncher}
        onToggle={toggleAppLauncher}
        title={t('new.page_title', { ns: 'sessions' })}
      >
        <JKAppLaunch customQueryString={customQueryString} toggle={toggleAppLauncher} />
      </JKModalDialog>
    </div>
  );
};

export default JKNewMusicSession;
