import React from "react";
import { Box, Flex, useBreakpointValue } from "@chakra-ui/react";
import * as Sentry from "@sentry/react";

import ItemsPanel from "./ItemsPanel";
import SearchToolbar, { searchQueryIsEmpty } from "./SearchToolbar";
import SearchPanel from "./SearchPanel";
import { MajorErrorMessage, TestErrorSender, useLocalStorage } from "../util";

/**
 * ItemsAndSearchPanels manages the shared layout and state for:
 *   - ItemsPanel, which shows the items in the outfit now, and
 *   - SearchPanel, which helps you find new items to add.
 *
 * These panels don't share a _lot_ of concerns; they're mainly intertwined by
 * the fact that they share the SearchToolbar at the top!
 *
 * We try to keep the search concerns in the search components, by avoiding
 * letting any actual _logic_ live at the root here; and instead just
 * performing some wiring to help them interact with each other via simple
 * state and refs.
 */
function ItemsAndSearchPanels({
  loading,
  searchQuery,
  onChangeSearchQuery,
  outfitState,
  outfitSaving,
  dispatchToOutfit,
}) {
  const scrollContainerRef = React.useRef();
  const searchQueryRef = React.useRef();
  const firstSearchResultRef = React.useRef();

  const hasRoomForSearchFooter = useBreakpointValue({ base: false, md: true });
  const [canUseSearchFooter] = useLocalStorage(
    "DTIFeatureFlagCanUseSearchFooter",
    false
  );
  const isShowingSearchFooter = canUseSearchFooter && hasRoomForSearchFooter;

  return (
    <Sentry.ErrorBoundary fallback={MajorErrorMessage}>
      <TestErrorSender />
      <Flex direction="column" height="100%">
        {isShowingSearchFooter && <Box height="2" />}
        {!isShowingSearchFooter && (
          <Box paddingX="5" paddingTop="3" paddingBottom="2" boxShadow="sm">
            <SearchToolbar
              query={searchQuery}
              searchQueryRef={searchQueryRef}
              firstSearchResultRef={firstSearchResultRef}
              onChange={onChangeSearchQuery}
            />
          </Box>
        )}
        {!isShowingSearchFooter && !searchQueryIsEmpty(searchQuery) ? (
          <Box
            key="search-panel"
            flex="1 0 0"
            position="relative"
            overflowY="scroll"
            ref={scrollContainerRef}
            data-test-id="search-panel-scroll-container"
          >
            <SearchPanel
              query={searchQuery}
              outfitState={outfitState}
              dispatchToOutfit={dispatchToOutfit}
              scrollContainerRef={scrollContainerRef}
              searchQueryRef={searchQueryRef}
              firstSearchResultRef={firstSearchResultRef}
            />
          </Box>
        ) : (
          <Box position="relative" overflow="auto" key="items-panel">
            <Box px="4" py="2">
              <ItemsPanel
                loading={loading}
                outfitState={outfitState}
                outfitSaving={outfitSaving}
                dispatchToOutfit={dispatchToOutfit}
              />
            </Box>
          </Box>
        )}
      </Flex>
    </Sentry.ErrorBoundary>
  );
}

export default ItemsAndSearchPanels;