"use client";

import { useState, useCallback } from "react";
import { DndContext, DragEndEvent } from "@dnd-kit/core";
import { cn, generateId } from "@/lib/utils";
import { useCanvasStore } from "@/lib/store";
import { DroppableCanvas, DraggableElement } from "../dragdrop";
import { DesktopOnlyGuard } from "@/components/ui";
import type { CanvasTemplate, DraggableElement as DraggableElementType } from "@/lib/types";

interface StakeholderMapCanvasProps {
  canvas: CanvasTemplate;
  className?: string;
}

/**
 * Carte des Parties Prenantes
 * Matrice circulaire pour positionner et cartographier les parties prenantes
 * Axe vertical: Fortement Touché ↔ Peu Touché (impact)
 * Axe horizontal: Peu de Pouvoir ↔ Beaucoup de Pouvoir
 */
export function StakeholderMapCanvas({ canvas, className }: StakeholderMapCanvasProps) {
  const [selectedId, setSelectedId] = useState<string | null>(null);
  const { getCanvas, addElement, updateElementPosition, updateElementLabel, removeElement } = useCanvasStore();

  const canvasData = getCanvas(canvas.id);
  const elements = canvasData?.elements || [];

  const handleDragEnd = useCallback((event: DragEndEvent) => {
    const { active, delta } = event;
    const element = elements.find((e) => e.id === active.id);

    if (element) {
      updateElementPosition(canvas.id, element.id, {
        x: element.position.x + delta.x,
        y: element.position.y + delta.y,
      });
    }
  }, [canvas.id, elements, updateElementPosition]);

  const handleAddStakeholder = useCallback(() => {
    const newElement: DraggableElementType = {
      id: generateId(),
      type: "stakeholder",
      position: { x: 300, y: 200 },
      label: "Nouvelle partie prenante",
    };
    addElement(canvas.id, newElement);
  }, [canvas.id, addElement]);

  const handleLabelChange = useCallback((elementId: string, label: string) => {
    updateElementLabel(canvas.id, elementId, label);
  }, [canvas.id, updateElementLabel]);

  const handleRemove = useCallback((elementId: string) => {
    removeElement(canvas.id, elementId);
    setSelectedId(null);
  }, [canvas.id, removeElement]);

  return (
    <DesktopOnlyGuard>
      <div className={cn("h-full flex", className)}>
        {/* Sidebar: Tools */}
        <div className="w-72 bg-gray-50 border-r border-gray-200 p-4 shrink-0 overflow-y-auto">
          <h3 className="text-sm font-bold text-gray-700 uppercase tracking-wide mb-4">
            Outils
          </h3>

          <button
            onClick={handleAddStakeholder}
            className="w-full px-4 py-3 bg-week2 text-white rounded-lg font-medium hover:bg-week2-dark transition-colors flex items-center gap-2"
          >
            <svg className="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
              <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 4v16m8-8H4" />
            </svg>
            Ajouter une partie prenante
          </button>

          <div className="mt-6 p-4 bg-white rounded-lg border border-gray-200">
            <h4 className="text-sm font-semibold text-gray-700 mb-3">
              Pensez au-delà de l&apos;évidence :
            </h4>
            <p className="text-xs text-gray-500 mb-3">
              Objectif : Minimum 12 parties prenantes
            </p>
            <ul className="text-xs text-gray-600 space-y-1">
              <li>• Utilisateurs directs & indirects</li>
              <li>• Famille, entourage, influenceurs</li>
              <li>• Médias, associations, communautés</li>
              <li>• Régulateurs, institutions publiques</li>
              <li>• Fournisseurs, sous-traitants</li>
              <li>• Canaux de distribution</li>
              <li>• Concurrents, partenaires</li>
              <li>• Financeurs, actionnaires</li>
            </ul>
          </div>

          <div className="mt-4 p-4 bg-white rounded-lg border border-gray-200">
            <h4 className="text-sm font-semibold text-gray-700 mb-3">
              Comment utiliser :
            </h4>
            <ul className="text-xs text-gray-600 space-y-2">
              <li>• Positionnez les parties prenantes selon leur influence et l&apos;impact sur elles</li>
              <li>• Utilisez des cercles pour grouper les acteurs similaires</li>
              <li>• Tracez des flèches pour montrer les relations</li>
              <li>• Notez les tensions et dépendances clés</li>
            </ul>
          </div>
        </div>

        {/* Main Canvas Area */}
        <div className="flex-1 p-6">
          <DndContext onDragEnd={handleDragEnd}>
            <DroppableCanvas
              id={`stakeholder-map-${canvas.id}`}
              className="bg-white rounded-xl border-2 border-gray-200"
              backgroundElement={<StakeholderMapBackground />}
              onBackgroundClick={() => setSelectedId(null)}
            >
              {elements.map((element) => (
                <DraggableElement
                  key={element.id}
                  element={element}
                  isSelected={selectedId === element.id}
                  onClick={() => setSelectedId(element.id)}
                  onLabelChange={(label) => handleLabelChange(element.id, label)}
                  onRemove={() => handleRemove(element.id)}
                />
              ))}
            </DroppableCanvas>
          </DndContext>
        </div>
      </div>
    </DesktopOnlyGuard>
  );
}

/**
 * Background SVG for the stakeholder map (concentric circles + axes)
 * Based on Figma design with proper axis labels
 */
function StakeholderMapBackground() {
  return (
    <svg
      viewBox="0 0 800 600"
      className="w-full h-full"
      preserveAspectRatio="xMidYMid meet"
    >
      {/* Concentric circles */}
      <circle cx="400" cy="300" r="250" fill="none" stroke="#E5E7EB" strokeWidth="1" />
      <circle cx="400" cy="300" r="180" fill="none" stroke="#E5E7EB" strokeWidth="1" />
      <circle cx="400" cy="300" r="110" fill="none" stroke="#E5E7EB" strokeWidth="1" />
      <circle cx="400" cy="300" r="50" fill="#F3F4F6" stroke="#D1D5DB" strokeWidth="2" />

      {/* Axes */}
      <line x1="100" y1="300" x2="700" y2="300" stroke="#D1D5DB" strokeWidth="1" />
      <line x1="400" y1="20" x2="400" y2="580" stroke="#D1D5DB" strokeWidth="1" />

      {/* Top Label - Fortement Touché */}
      <text x="400" y="25" textAnchor="middle" className="fill-gray-700 text-sm font-semibold">
        Fortement Touché
      </text>
      <text x="400" y="42" textAnchor="middle" className="fill-gray-400 text-xs">
        (impact élevé sur cette partie prenante)
      </text>

      {/* Bottom Label - Peu Touché */}
      <text x="400" y="565" textAnchor="middle" className="fill-gray-700 text-sm font-semibold">
        Peu Touché
      </text>
      <text x="400" y="582" textAnchor="middle" className="fill-gray-400 text-xs">
        (impact faible sur cette partie prenante)
      </text>

      {/* Left Label - Peu de Pouvoir (rotated) */}
      <g transform="translate(30, 300) rotate(-90)">
        <text x="0" y="0" textAnchor="middle" className="fill-gray-700 text-sm font-semibold">
          Peu de Pouvoir
        </text>
      </g>
      <g transform="translate(50, 300) rotate(-90)">
        <text x="0" y="0" textAnchor="middle" className="fill-gray-400 text-xs">
          Ex: Utilisateurs finaux, familles
        </text>
      </g>

      {/* Right Label - Beaucoup de Pouvoir (rotated) */}
      <g transform="translate(770, 300) rotate(90)">
        <text x="0" y="0" textAnchor="middle" className="fill-gray-700 text-sm font-semibold">
          Beaucoup de Pouvoir
        </text>
      </g>
      <g transform="translate(750, 300) rotate(90)">
        <text x="0" y="0" textAnchor="middle" className="fill-gray-400 text-xs">
          Ex: Régulateurs, médias, fournisseurs clés
        </text>
      </g>

      {/* Center label - Votre Organisation */}
      <text x="400" y="295" textAnchor="middle" className="fill-gray-600 text-xs font-medium">
        Votre
      </text>
      <text x="400" y="310" textAnchor="middle" className="fill-gray-600 text-xs font-medium">
        Organisation
      </text>
    </svg>
  );
}
