/* eslint-disable @typescript-eslint/no-explicit-any */
import React, { useEffect, useState } from 'react';

import { point } from '@turf/helpers';
import { useTranslation } from 'react-i18next';
import { IoFlag } from 'react-icons/io5';
import { RiMapPin2Fill, RiMapPin3Fill } from 'react-icons/ri';
import nextId from 'react-id-generator';
import { Popup } from 'react-map-gl/maplibre';
import { useSelector } from 'react-redux';

import { editoastToEditorEntity } from 'applications/editor/data/api';
import type { TrackSectionEntity } from 'applications/editor/tools/trackEdition/types';
import { calculateDistanceAlongTrack } from 'applications/editor/tools/utils';
import { useManageTrainScheduleContext } from 'applications/operationalStudies/hooks/useManageTrainScheduleContext';
import type { ManageTrainSchedulePathProperties } from 'applications/operationalStudies/types';
import { osrdEditoastApi } from 'common/api/osrdEditoastApi';
import { useOsrdConfSelectors } from 'common/osrdContext';
import { setPointIti } from 'modules/trainschedule/components/ManageTrainSchedule/ManageTrainScheduleMap/setPointIti';
import type { PathStep } from 'reducers/osrdconf/types';

import type { FeatureInfoClick } from '../types';

type AddPathStepPopupProps = {
  pathProperties?: ManageTrainSchedulePathProperties;
  featureInfoClick: FeatureInfoClick;
  resetFeatureInfoClick: () => void;
};

function AddPathStepPopup({
  pathProperties,
  featureInfoClick,
  resetFeatureInfoClick,
}: AddPathStepPopupProps) {
  const { getInfraID, getOrigin, getDestination } = useOsrdConfSelectors();
  const { launchPathfinding } = useManageTrainScheduleContext();
  const { t } = useTranslation(['operationalStudies/manageTrainSchedule']);
  const infraId = useSelector(getInfraID);
  const origin = useSelector(getOrigin);
  const destination = useSelector(getDestination);

  const [trackOffset, setTrackOffset] = useState(0);

  const [getTrackEntity] =
    osrdEditoastApi.endpoints.postInfraByInfraIdObjectsAndObjectType.useLazyQuery();

  useEffect(() => {
    const calculateOffset = async () => {
      const trackId = featureInfoClick.feature.properties?.id;
      const result = await getTrackEntity({
        infraId: infraId!,
        objectType: 'TrackSection',
        body: [trackId],
      }).unwrap();

      if (!result.length) {
        console.error('No track found');
        return;
      }

      const trackEntity = editoastToEditorEntity<TrackSectionEntity>(result[0], 'TrackSection');
      const offset = calculateDistanceAlongTrack(
        trackEntity,
        point(featureInfoClick.coordinates.slice(0, 2)).geometry,
        'millimeters'
      );
      setTrackOffset(offset);
    };

    calculateOffset();
  }, [featureInfoClick]);

  if (!featureInfoClick.feature.properties) return null;

  const { properties: trackProperties } = featureInfoClick.feature;
  const coordinates = featureInfoClick.coordinates.slice(0, 2);

  const pathStepProperties: PathStep = {
    id: nextId(),
    coordinates,
    track: trackProperties.id,
    offset: Math.round(trackOffset), // offset needs to be an integer
    kp: trackProperties.kp,
    metadata: {
      lineCode: trackProperties.extensions_sncf_line_code,
      lineName: trackProperties.extensions_sncf_line_name,
      trackName: trackProperties.extensions_sncf_track_name,
      trackNumber: trackProperties.extensions_sncf_track_number,
    },
  };

  return (
    <Popup
      longitude={featureInfoClick.coordinates[0]}
      latitude={featureInfoClick.coordinates[1]}
      closeButton={false}
      closeOnClick={false}
      className="map-popup-click-select"
    >
      <div className="details">
        <div className="details-track">
          {featureInfoClick.feature.properties.extensions_sncf_track_name}
          <small>{featureInfoClick.feature.properties.extensions_sncf_line_code}</small>
        </div>
        <div className="details-line">
          {featureInfoClick.feature.properties.extensions_sncf_line_name}
        </div>
      </div>

      <div className="actions">
        <button
          data-testid="map-origin-button"
          className="btn btn-sm btn-success"
          type="button"
          onClick={() =>
            setPointIti('origin', pathStepProperties, launchPathfinding, resetFeatureInfoClick)
          }
        >
          <RiMapPin2Fill />
          <span className="d-none">{t('origin')}</span>
        </button>
        {origin && destination && (
          <button
            className="btn btn-sm btn-info"
            type="button"
            onClick={() =>
              setPointIti(
                'via',
                pathStepProperties,
                launchPathfinding,
                resetFeatureInfoClick,
                pathProperties
              )
            }
          >
            <RiMapPin3Fill />
            <span className="d-none">{t('via')}</span>
          </button>
        )}
        <button
          data-testid="map-destination-button"
          className="btn btn-sm btn-warning"
          type="button"
          onClick={() =>
            setPointIti('destination', pathStepProperties, launchPathfinding, resetFeatureInfoClick)
          }
        >
          <IoFlag />
          <span className="d-none">{t('destination')}</span>
        </button>
      </div>
    </Popup>
  );
}

export default React.memo(AddPathStepPopup);