import React, { useContext, useState } from 'react';
import styled from '@emotion/styled';
import { css, Global } from '@emotion/core';
import _ from 'lodash';
import { Link } from 'gatsby'
import AlgoliaProductItem from './AlgoliaProductItem'
import AlgoliaUncommonryItem from './AlgoliaUncommonryItem'
import AlgoliaEmailsItem from './AlgoliaEmailsItem'
import BuyGiftCard from '../components/Cart/BuyGiftCard'
import AlgoliaRangeSlider from './AlgoliaRangeSlider'
import AlgoliaStateResults from './AlgoliaStateResults'
import algoliasearch from 'algoliasearch/lite';
import aa from "search-insights";
import {
  InstantSearch,
  Hits,
  InfiniteHits,
  SearchBox,
  Pagination,
  ClearRefinements,
  RefinementList,
  NumericMenu,
  Configure,
  connectHitInsights,
  connectSearchBox,
} from 'react-instantsearch-dom';
import 'instantsearch.css/themes/algolia.css';

const SearchWrapper = styled.div`
  width: 100%;
  display: flex;
  @media (max-width: 600px) {
    font-size: 0.5rem;
  }
`;

const LeftPanel = styled.div`
  float: left;
  width: 20vw;
  @media (max-width: 600px) {
    display: none;
  }
  .ais-ClearRefinements-button {
    background-color: #C04CFD;
    @media (max-width: 600px) {
      font-size: 0.5rem;
    }
  }
  .ais-SortBy {
    padding: 0.8rem 0 0.8rem 0;
  }
  .ais-SortBy-select {
    font-size: 0.8rem;
    @media (max-width: 600px) {
      font-size: 0.5rem;
    }
  }
  .ais-RefinementList-item, .ais-NumericMenu-item {
    margin-bottom: 0px;
    @media (max-width: 600px) {
      margin: 0;
    }
  }
  .ais-RefinementList-label , .ais-NumericMenu-label, .ais-RefinementList-checkbox {
    font-size: 0.8rem;
    @media (max-width: 600px) {
      font-size: 0.5rem;
    }
  }
  .ais-RefinementList-labelText , .ais-NumericMenu-labelText {
    margin-left: 5px;
    font-size: 0.8rem;
    @media (max-width: 600px) {
      font-size: 0.5rem;
      line-height: 0.5rem;
    }
  }
  .ais-RefinementList-count {
    display: none;
    font-size: 0.6rem;
  }
  .ais-RangeSlider {
    margin: 0.8rem 1rem 2.4rem 1rem;
  }
  .rheostat-value {
    transform: translateX(-70%);
  }
`;

const RightPanel = styled.div`
  width: 90vw;
  @media (max-width: 600px) {
    width: 95vw;
    margin-left: 0px;
    display: block;
  }
  .searchline {
      display: flex;
    margin: 0 0 2em 0;
  }
  .searchContainer {
    width: 60%;
  }
  .ais-SearchBox-input{
    padding: 0.5rem 1.8remm;
    height: 50px;
  }
  .giftCard {
    text-align: center;
    margin-left: 1em;
    @media (max-width: 900px) {
      margin-left: 0.5em;
    }
  }
  button.Product__buy.button {
      @media (max-width: 800px) {
    padding: 2px;
  }
  }
  .GiftCard--BuyButton {
    @media (max-width: 800px) {
        display:none;
      diplay: block;
      font-size: 1.4em;
      padding: 0px;
    }
  }
  form.ais-SearchBox-form {
        margin-bottom: 1em;
  }
  .indexSelect {
    float:left;
    width: 18%;
    height: 50px;
    margin-right: 0.5rem;
    @media (max-width: 900px) {
      width: calc(15% - 1rem);
    }
    @media (max-width: 600px) {
      width: calc(35% - 1rem);
    }
  }
  .indexSelect select{
    padding: 0.5rem;
    width: 100%;
    position: relative;
    background-color: #fff;
    border: 1px solid #c4c8d8;
    border-radius: 5px;
    font-size: 1rem;
    color: #a5abc4;
    height: 50px;
    @media (max-width: 600px) {
      font-size: 0.8rem;
    padding: 0.25rem;
    }
  }
  .saleFacet {
    float:left;
    width: 100px;
    margin-right: 0.5rem;
  }
  .saleFacet .ais-RefinementList-count {
    display: none;
  }
  .saleFacet .ais-RefinementList-labelText , .ais-NumericMenu-labelText {
    margin-left: 5px;
    font-size: 0.8rem;
    @media (max-width: 600px) {
      font-size: 0.5rem;
      line-height: 0.5rem;
    }
  }
  li.ais-Hits-item a {
    color: #3a4570;
  }
  .ais-Hits-item, .ais-Results-item {
    padding: 0px;
    width: calc(25% - 1rem);
    margin: 0.5em;
    @media (max-width: 900px) {
      width: calc(33.33% - 1rem);
    }
    @media (max-width: 600px) {
      width: calc(50% - 1rem);
    }
  }
  .ais-SearchBox {
    @media (min-width: 900px) {
      width: calc(80% - 1rem);
    }
    width: 100%;
      margin: 0;
      display: inline-block;
  }
  .ais-Pagination-item--selected .ais-Pagination-link {
    color: #FFF;
    background-color: #C04CFD;
    border-color:#C04CFD
  }
  .ais-Pagination-item--disabled .ais-Pagination-link, .ais-Pagination-link, a.ais-Pagination-link {
    color: #a5abc4;
    padding: .3rem .5rem;
    font-size: .9rem;
  }
  .ais-Breadcrumb-link, .ais-HierarchicalMenu-link, .ais-Menu-link, .ais-Pagination-link, .ais-RatingMenu-link {
    color:#C04CFD
  }
  .suggestions {
    width: 70%;
    font-style: italic;
    display: inline-block;
    margin: 0 0 0 0.5em;
    @media (max-width: 900px) {
      width: 90%;
    }
    .ais-InfiniteHits-loadMore {
      display : none;
    }
    .ais-InfiniteHits-item {
      margin: 0px;
      width: auto;
      border: 0px;
      box-shadow: none;
      padding: 0 0.3em;
    }
  }
`;

const FilterHeading = styled.div`
  font-size: 0.8rem;
  text-transform: uppercase;
  font-weight: bold;
  margin: 8px 0 5px 0;
  @media (max-width: 600px) {
    font-size: 0.5rem;
  }
`;
const VirtualSearchBox = connectSearchBox(() => null);

const AlgoliaProductList = ({ defaultFilter, defaultSearchTerm, itemsPerPage, hideLeftPanel, hideCTAButton, showClearFilter, facetsToShow, showSearchBox, showSearchSuggestions, searchIndexName, enableShopProductSwitch, enableCart, noResultMessage }) => {

  const [currentIndexName, setCurrentIndexName] = React.useState(searchIndexName || `empProducts`)
  const changeCurrentIndexName = (e) => { setCurrentIndexName(e.target.value); setCurrentSuggestionIndexName(getSuggestionIndex(e.target.value)); setSuggestionQuery(''); }

  const getSuggestionIndex = (mainIndexName) => {
    if (mainIndexName == 'empProducts') return ('empProducts_query_suggestions');
    if (mainIndexName == 'uncommonry') return ('uncommonry_query_suggestions')
  }
  const [currentSuggestionIndexName, setCurrentSuggestionIndexName] = React.useState(getSuggestionIndex(currentIndexName))
  const [suggestionQuery, setSuggestionQuery] = React.useState();

  const algoliaClient = algoliasearch(
    process.env.GATSBY_ALGOLIA_APP_ID,
    process.env.GATSBY_ALGOLIA_SEARCH_KEY
  );
  const searchClient = {
    search(requests) {
      if (requests.length > 0 && defaultSearchTerm) requests[0].params.query = defaultSearchTerm
      return algoliaClient.search(requests);
    },
  };
  noResultMessage = noResultMessage || `No result found`;
  enableCart = enableCart || false;
  itemsPerPage = itemsPerPage || 12;
  
  aa('init', {
    appId: process.env.GATSBY_ALGOLIA_APP_ID,
    apiKey: process.env.GATSBY_ALGOLIA_SEARCH_KEY
  });

  const [currentHitComponent, setCurrentHitComponent] = React.useState();
  React.useEffect(() => {
    if (currentIndexName == 'empProducts') setCurrentHitComponent(() => connectHitInsights(aa)(AlgoliaProductItem));
    if (currentIndexName == 'uncommonry') setCurrentHitComponent(() => connectHitInsights(aa)(AlgoliaUncommonryItem));
    if (currentIndexName == 'emails') setCurrentHitComponent(() => connectHitInsights(aa)(AlgoliaEmailsItem));
  }, [currentIndexName]);

  const AlgoliaSuggestions = ({ hit }) => {
    return (
      <a href="javascript:" onClick={() => setSuggestionQuery(hit.query)}>{hit.query}</a>
    );
  }

  return (
    <SearchWrapper>
      {!enableCart &&
        <Global
          styles={css`
            .cart-section {
              display: none;
            }
        `}
        />
      }
      <InstantSearch indexName={currentIndexName} searchClient={searchClient}>
        <VirtualSearchBox defaultRefinement={suggestionQuery} />
        {!hideLeftPanel &&
          <LeftPanel>

            {showClearFilter &&
              <ClearRefinements />
            }
            {facetsToShow && facetsToShow.indexOf("category") >= 0 &&
              <>
                <FilterHeading>Category</FilterHeading>
                <RefinementList attribute="shopCategory" showMore='true' limit='5' />
              </>
            }
            {facetsToShow && facetsToShow.indexOf("brands") >= 0 && currentIndexName != 'uncommonry' &&
              <>
                <FilterHeading>Brands</FilterHeading>
                <RefinementList attribute="shopName" showMore='true' limit='5' />
              </>
            }
            {facetsToShow && facetsToShow.indexOf("payments") >= 0 && currentIndexName == 'uncommonry' &&
              <>
                <FilterHeading>Payments</FilterHeading>
                <RefinementList
                  attribute="shopifyPay"
                  transformItems={items =>
                    items.filter(item => (item.label == '1')).map(item => ({
                      ...item,
                      label: "Shop Pay",
                    }))
                  }
                />
                <RefinementList
                  attribute="paypal"
                  transformItems={items =>
                    items.filter(item => (item.label == '1')).map(item => ({
                      ...item,
                      label: "Paypal",
                    }))
                  }
                />
                <RefinementList
                  attribute="applePay"
                  transformItems={items =>
                    items.filter(item => (item.label == '1')).map(item => ({
                      ...item,
                      label: "Apple Pay",
                    }))
                  }
                />
                <RefinementList
                  attribute="amazonPay"
                  transformItems={items =>
                    items.filter(item => (item.label == '1')).map(item => ({
                      ...item,
                      label: "Amazon Pay",
                    }))
                  }
                />
              </>
            }
            {facetsToShow && facetsToShow.indexOf("pricerangeslider") >= 0 && currentIndexName == 'uncommonry' &&
              <>
                <FilterHeading>Average Price</FilterHeading>
                <AlgoliaRangeSlider attribute="price" />
              </>
            }
            {facetsToShow && facetsToShow.indexOf("prices") >= 0 && currentIndexName == 'empProducts' &&
              <>
                <FilterHeading>Prices</FilterHeading>
                <NumericMenu
                  attribute="price"
                  items={[
                    { label: 'All' },
                    { label: 'Under $50', end: 50 },
                    { label: '$50 - $100', start: 50, end: 100 },
                    { label: '$100 - $200', start: 100, end: 200 },
                    { label: '$200+', start: 200 },
                  ]}
                />
              </>
            }
            {/*
            {facetsToShow && facetsToShow.indexOf("giftcard") >= 0 && currentIndexName == 'empProducts' &&
              <>
                <FilterHeading>Gift Card</FilterHeading>
                <RefinementList
                  attribute="name"
                  transformItems={items =>
                    items.filter(item => (item.label.toLowerCase().indexOf('gift') >= 0))
                  }
                />
              </>
            }
            {facetsToShow && facetsToShow.indexOf("gifimage") >= 0 && currentIndexName == 'empProducts' &&
              <>
                <FilterHeading>GIF</FilterHeading>
                <RefinementList
                  attribute="imageURL"
                  transformItems={items =>
                    items.filter(item => (item.label.indexOf('.gif') >= 0)).map(item => ({
                      ...item,
                      label: "GIF",
                    }))
                  }
                />
              </>
            }
            */}

            {facetsToShow && facetsToShow.indexOf("storeoffers") >= 0 &&
              <>
                <FilterHeading>Store Offers</FilterHeading>
                <RefinementList
                  attribute="freeShipMin"
                  transformItems={items =>
                    items.filter(item => (item.label == 0)).map(item => ({
                      ...item,
                      label: "Free Shipping",
                    }))
                  }
                />
                <RefinementList
                  attribute="returnShipFree"
                  transformItems={items =>
                    items.filter(item => (item.label == 'Yes')).map(item => ({
                      ...item,
                      label: "Free Returns",
                    }))
                  }
                />
              </>
            }
          </LeftPanel>
        }
        <RightPanel>
          <Configure clickAnalytics={true} hitsPerPage={itemsPerPage} filters={defaultFilter} />
          <div class="searchline">
            <div class="indexSelect">
              {enableShopProductSwitch &&
                <div style={{ paddingBottom: '0.75rem' }}>
                  <select value={currentIndexName} onChange={changeCurrentIndexName}>
                    <option value="uncommonry">Shops</option>
                    <option value="empProducts">Products</option>
                  </select>
                </div>
              }
            </div>
            {facetsToShow && facetsToShow.indexOf("onsale") >= 0 &&
              <div class="saleFacet">
                <RefinementList
                  attribute="onSale"
                  transformItems={items =>
                    items.filter(item => (item.label == '1')).map(item => ({
                      ...item,
                      label: "On Sale",
                    }))
                  }
                />
              </div>
            }
          <div class="searchContainer">
            {showSearchBox &&
              <>
                <SearchBox defaultRefinement={suggestionQuery} />
              </>
            }<br style={{ clear: 'both' }} />
  {showSearchSuggestions && currentSuggestionIndexName &&
    <span style={{ 'font-weight': 'bold', 'padding': '0 1em 1em 0' }}>Trending </span>
  }
            {showSearchSuggestions && currentSuggestionIndexName &&

              <div className="suggestions">

                <InstantSearch
                  searchClient={searchClient}
                  indexName={currentSuggestionIndexName}
                >
                  <Configure hitsPerPage={5} />
                  <InfiniteHits hitComponent={AlgoliaSuggestions} />
                </InstantSearch>
              </div>
            }
            </div>
            {!hideCTAButton &&
              <div class="giftCard">
                <BuyGiftCard />
              </div>
            }
          </div>

          <AlgoliaStateResults noResultMessage={noResultMessage} />
          <Hits hitComponent={currentHitComponent} />
          <Pagination />
        </RightPanel>
      </InstantSearch>
    </SearchWrapper>
  );
}
export default AlgoliaProductList;