"use client";

import { useEffect, useMemo, useState } from "react";
import { MapContainer, Marker, TileLayer, useMapEvents } from "react-leaflet";
import L from "leaflet";
import "leaflet/dist/leaflet.css";
import { useI18n } from "@/lib/i18n";
import { X } from "lucide-react";

const RIYADH = { lat: 24.7136, lng: 46.6753 };

const pin = L.divIcon({
  className: "",
  html: `<span style="display:block;width:18px;height:18px;border-radius:18px 18px 18px 0;background:#C9A84C;border:2px solid #1A1A2E;transform:rotate(-45deg)"></span>`,
  iconSize: [18, 18],
  iconAnchor: [9, 18],
});

function savedPoint(lat: string, lng: string) {
  if (!lat.trim() || !lng.trim()) return null;
  const latitude = Number(lat);
  const longitude = Number(lng);
  if (!Number.isFinite(latitude) || !Number.isFinite(longitude)) return null;
  return { lat: latitude, lng: longitude };
}

function MapClick({ onPick }: { onPick: (lat: number, lng: number) => void }) {
  useMapEvents({
    click(event) {
      onPick(event.latlng.lat, event.latlng.lng);
    },
  });
  return null;
}

export default function LocationPicker({
  lat,
  lng,
  onClose,
  onConfirm,
}: {
  lat: string;
  lng: string;
  onClose: () => void;
  onConfirm: (value: { lat: string; lng: string; label: string }) => void;
}) {
  const { t, lang } = useI18n();
  const saved = useMemo(() => savedPoint(lat, lng), [lat, lng]);
  const [point, setPoint] = useState(saved || RIYADH);
  const [ready, setReady] = useState(Boolean(saved));
  const [saving, setSaving] = useState(false);

  useEffect(() => {
    if (saved) return;
    if (!navigator.geolocation) {
      setReady(true);
      return;
    }
    navigator.geolocation.getCurrentPosition(
      (position) => {
        setPoint({ lat: position.coords.latitude, lng: position.coords.longitude });
        setReady(true);
      },
      () => setReady(true),
      { enableHighAccuracy: true, timeout: 10000 }
    );
  }, [saved]);

  const confirm = async () => {
    if (saving) return;
    setSaving(true);
    const latitude = point.lat.toFixed(6);
    const longitude = point.lng.toFixed(6);
    let label = `${latitude}, ${longitude}`;
    try {
      const response = await fetch(
        `https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=${latitude}&lon=${longitude}`,
        { headers: { "Accept-Language": lang === "en" ? "en" : "ar" } }
      );
      if (response.ok) {
        const body = (await response.json()) as { display_name?: string };
        if (body.display_name) label = body.display_name;
      }
    } catch {
      label = `${latitude}, ${longitude}`;
    }
    onConfirm({ lat: latitude, lng: longitude, label });
    setSaving(false);
  };

  return (
    <div className="fixed inset-0 z-[60] flex items-center justify-center bg-black/50 p-4">
      <div className="flex w-full max-w-[640px] flex-col overflow-hidden rounded-2xl border border-[#E8E4D9] bg-white p-[25px] shadow-[0px_25px_50px_-12px_rgba(0,0,0,0.25)]">
        <div className="mb-4 flex items-center justify-between">
          <h3 className="text-base font-bold leading-6 text-[#1A1A2E]">{t("location")}</h3>
          <button
            type="button"
            onClick={onClose}
            className="flex size-8 items-center justify-center rounded-lg text-[#4A4A6A] hover:bg-[#FAFAF8]"
          >
            <X className="size-4" />
          </button>
        </div>
        <p className="mb-3 text-sm leading-5 text-[#4A4A6A]">{t("pickOnMap")}</p>
        <div className="h-[360px] overflow-hidden rounded-xl border border-[#E8E4D9]">
          {!ready ? (
            <p className="flex h-full items-center justify-center text-sm text-[#4A4A6A]">{t("loading")}</p>
          ) : (
            <MapContainer center={point} zoom={13} style={{ height: "100%", width: "100%" }} scrollWheelZoom>
              <TileLayer attribution='&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>' url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png" />
              <MapClick onPick={(nextLat, nextLng) => setPoint({ lat: nextLat, lng: nextLng })} />
              <Marker
                position={point}
                icon={pin}
                draggable
                eventHandlers={{
                  dragend: (event) => {
                    const next = event.target.getLatLng();
                    setPoint({ lat: next.lat, lng: next.lng });
                  },
                }}
              />
            </MapContainer>
          )}
        </div>
        <button
          type="button"
          onClick={confirm}
          disabled={saving}
          className="mt-4 flex h-11 w-full items-center justify-center rounded-xl bg-gradient-to-br from-[#C9A84C] via-[#E8C94A] to-[#A07830] text-sm font-bold text-[#1A1A2E] transition-opacity hover:opacity-90 disabled:opacity-50"
        >
          {t("confirmLocation")}
        </button>
      </div>
    </div>
  );
}
