import React, { useEffect, useState } from 'react';
import useSWR from 'swr';
import SidebarListView from './Sidebar/SidebarListView';
import type { PointOfInterest } from './types/PointOfInterest';
import SidebarSingleView from './Sidebar/SidebarSingleView';
import Map from './Map/Map';
import Modal from './Modal';
import { ExclamationOutline as AlertIcon } from 'heroicons-react';

function App() {
  const [poiData, setPoiData] = useState<PointOfInterest[]>([]);
  const [selectedPoi, setSelectedPoi] = useState<null | PointOfInterest>(null);
  const [hoveredPoiId, setHoveredPoiId] = useState<null | number>(null);
  const [showErrorModal, setShowErrorModal] = useState<boolean>(false);

  const handlePoiClick = (id: number) => {
    const newPoi = poiData.find((poi) => poi.id === id);
    newPoi && setSelectedPoi(newPoi);
  };

  const handlePoiClose = () => {
    setSelectedPoi(null);
  };

  const handlePoiHoverOn = (poiId: number) => {
    setHoveredPoiId(poiId);
  };

  const handlePoiHoverOff = () => {
    setHoveredPoiId(null);
  };

  const { data, error } = useSWR(
    `{
      pois {
        id
        name
        description
        website
        address
        lat
        lng
        image
        category
      }
    }
    `,
  );

  useEffect(() => {
    data && console.log('Fetched new data', data);
    data?.pois && setPoiData(data.pois);
  }, [data]);

  useEffect(() => {
    if (error) {
      console.error('Error while fetching', error);
      setShowErrorModal(true);
    }
  }, [error]);

  return (
    <>
      {showErrorModal && (
        <Modal
          title="API nicht erreichbar"
          text="Kann die API nicht erreichen. Bitte später erneut probieren."
          icon={<AlertIcon className="h-6 w-6 text-red-600" />}
        />
      )}
      <div className={'flex md:flex-row-reverse flex-col h-full'}>
        <Map
          onMouseEnter={handlePoiHoverOn}
          onMouseLeave={handlePoiHoverOff}
          hoveredPoiId={hoveredPoiId}
          values={poiData}
          onSelect={handlePoiClick}
          selectedEntry={selectedPoi}
        />
        {selectedPoi ? (
          <SidebarSingleView className="sidebar" value={selectedPoi} onClose={handlePoiClose} />
        ) : (
          <SidebarListView
            hoveredPoiId={hoveredPoiId}
            onMouseEnter={handlePoiHoverOn}
            onMouseLeave={handlePoiHoverOff}
            className="sidebar"
            values={poiData}
            onClick={handlePoiClick}
          />
        )}
      </div>
    </>
  );
}

export default App;