'use client';

import React, { useState, useRef, useEffect, useCallback } from 'react';
import styles from './QuickActionsMenu.module.css';

interface QuickActionsMenuProps {
  onStartSupport: () => void;
  onEditDNS: () => void;
  onRegeneratePages: () => void;
  onReindexGSC?: () => void;
  stripeCustomerId: string | null;
  hasSubdomain: boolean;
  canReindexGSC?: boolean;
  isStartingSupport?: boolean;
  isRegenerating?: boolean;
  isReindexingGSC?: boolean;
}

// Menu item IDs for aria-activedescendant
const MENU_ITEMS = [
  'menu-support',
  'menu-stripe',
  'menu-dns',
  'menu-regenerate',
  'menu-reindex-gsc',
] as const;

export function QuickActionsMenu({
  onStartSupport,
  onEditDNS,
  onRegeneratePages,
  onReindexGSC,
  stripeCustomerId,
  hasSubdomain,
  canReindexGSC,
  isStartingSupport,
  isRegenerating,
  isReindexingGSC,
}: QuickActionsMenuProps) {
  const [isOpen, setIsOpen] = useState(false);
  const [activeIndex, setActiveIndex] = useState(-1);
  const menuRef = useRef<HTMLDivElement>(null);
  const triggerRef = useRef<HTMLButtonElement>(null);

  // Helper to close menu and reset state
  const closeMenu = useCallback(() => {
    setIsOpen(false);
    setActiveIndex(-1);
  }, []);

  // Helper to toggle menu
  const toggleMenu = useCallback(() => {
    setIsOpen((prev) => {
      if (!prev) setActiveIndex(-1); // Reset on open
      return !prev;
    });
  }, []);

  // Handle keyboard navigation
  const handleKeyDown = useCallback(
    (event: KeyboardEvent) => {
      if (!isOpen) return;

      switch (event.key) {
        case 'Escape':
          closeMenu();
          triggerRef.current?.focus();
          break;

        case 'ArrowDown':
          event.preventDefault();
          setActiveIndex((prev) => {
            const next = prev + 1;
            return next >= MENU_ITEMS.length ? 0 : next;
          });
          break;

        case 'ArrowUp':
          event.preventDefault();
          setActiveIndex((prev) => {
            const next = prev - 1;
            return next < 0 ? MENU_ITEMS.length - 1 : next;
          });
          break;

        case 'Enter':
        case ' ':
          if (activeIndex >= 0) {
            event.preventDefault();
            const activeItem = document.getElementById(MENU_ITEMS[activeIndex]);
            if (activeItem && !activeItem.hasAttribute('disabled')) {
              activeItem.click();
            }
          }
          break;

        case 'Home':
          event.preventDefault();
          setActiveIndex(0);
          break;

        case 'End':
          event.preventDefault();
          setActiveIndex(MENU_ITEMS.length - 1);
          break;
      }
    },
    [isOpen, activeIndex, closeMenu]
  );

  // Close menu when clicking outside
  useEffect(() => {
    function handleClickOutside(event: MouseEvent) {
      if (menuRef.current && !menuRef.current.contains(event.target as Node)) {
        closeMenu();
      }
    }

    if (isOpen) {
      document.addEventListener('mousedown', handleClickOutside);
      document.addEventListener('keydown', handleKeyDown);
    }

    return () => {
      document.removeEventListener('mousedown', handleClickOutside);
      document.removeEventListener('keydown', handleKeyDown);
    };
  }, [isOpen, handleKeyDown, closeMenu]);

  // Build Stripe dashboard URL
  const getStripeCustomerUrl = (customerId: string) => {
    const isTestMode = process.env.NEXT_PUBLIC_STRIPE_TEST_MODE === 'true';
    const basePath = isTestMode ? '/test' : '';
    return `https://dashboard.stripe.com${basePath}/customers/${customerId}`;
  };

  // Get active class for menu item
  const getMenuItemClass = (index: number) => {
    return activeIndex === index ? `${styles.menuItem} ${styles.menuItemActive}` : styles.menuItem;
  };

  return (
    <div className={styles.container} ref={menuRef}>
      <button
        ref={triggerRef}
        className={styles.trigger}
        onClick={toggleMenu}
        aria-haspopup="menu"
        aria-expanded={isOpen}
        aria-label="Actions menu"
      >
        <svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor">
          <circle cx="8" cy="3" r="1.5" />
          <circle cx="8" cy="8" r="1.5" />
          <circle cx="8" cy="13" r="1.5" />
        </svg>
      </button>

      {isOpen && (
        <div
          className={styles.dropdown}
          role="menu"
          aria-activedescendant={activeIndex >= 0 ? MENU_ITEMS[activeIndex] : undefined}
        >
          <button
            id="menu-support"
            className={getMenuItemClass(MENU_ITEMS.indexOf('menu-support'))}
            onClick={() => {
              onStartSupport();
              closeMenu();
            }}
            disabled={isStartingSupport}
            role="menuitem"
            tabIndex={-1}
          >
            <svg
              className={styles.menuIcon}
              width="16"
              height="16"
              viewBox="0 0 24 24"
              fill="none"
              stroke="currentColor"
              strokeWidth="2"
            >
              <path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2" />
              <circle cx="12" cy="7" r="4" />
            </svg>
            {isStartingSupport ? 'Starting...' : 'Start Support Session'}
          </button>

          <button
            id="menu-stripe"
            className={getMenuItemClass(MENU_ITEMS.indexOf('menu-stripe'))}
            onClick={() => {
              if (stripeCustomerId) {
                window.open(getStripeCustomerUrl(stripeCustomerId), '_blank');
              }
              closeMenu();
            }}
            disabled={!stripeCustomerId}
            role="menuitem"
            tabIndex={-1}
            title={
              !stripeCustomerId ? 'No Stripe customer ID - checkout may not be complete' : undefined
            }
          >
            <svg
              className={styles.menuIcon}
              width="16"
              height="16"
              viewBox="0 0 24 24"
              fill="none"
              stroke="currentColor"
              strokeWidth="2"
            >
              <path d="M21 4H3a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2z" />
              <path d="M1 10h22" />
            </svg>
            View in Stripe
            {!stripeCustomerId && (
              <svg
                className={styles.warningIcon}
                width="14"
                height="14"
                viewBox="0 0 24 24"
                fill="none"
                stroke="#f59e0b"
                strokeWidth="2"
              >
                <circle cx="12" cy="12" r="10" />
                <line x1="12" y1="8" x2="12" y2="12" />
                <line x1="12" y1="16" x2="12.01" y2="16" />
              </svg>
            )}
          </button>

          <div className={styles.divider} role="separator" />

          <button
            id="menu-dns"
            className={getMenuItemClass(MENU_ITEMS.indexOf('menu-dns'))}
            onClick={() => {
              onEditDNS();
              closeMenu();
            }}
            role="menuitem"
            tabIndex={-1}
          >
            <svg
              className={styles.menuIcon}
              width="16"
              height="16"
              viewBox="0 0 24 24"
              fill="none"
              stroke="currentColor"
              strokeWidth="2"
            >
              <path d="M12 2L2 7l10 5 10-5-10-5z" />
              <path d="M2 17l10 5 10-5" />
              <path d="M2 12l10 5 10-5" />
            </svg>
            Edit Subdomain
          </button>

          <button
            id="menu-regenerate"
            className={getMenuItemClass(MENU_ITEMS.indexOf('menu-regenerate'))}
            onClick={() => {
              onRegeneratePages();
              closeMenu();
            }}
            disabled={!hasSubdomain || isRegenerating}
            role="menuitem"
            tabIndex={-1}
            title={!hasSubdomain ? 'No subdomain - no pages to regenerate' : undefined}
          >
            <svg
              className={styles.menuIcon}
              width="16"
              height="16"
              viewBox="0 0 24 24"
              fill="none"
              stroke="currentColor"
              strokeWidth="2"
            >
              <path d="M21 2v6h-6" />
              <path d="M3 12a9 9 0 0 1 15-6.7L21 8" />
              <path d="M3 22v-6h6" />
              <path d="M21 12a9 9 0 0 1-15 6.7L3 16" />
            </svg>
            {isRegenerating ? 'Regenerating...' : 'Regenerate Pages'}
          </button>

          <button
            id="menu-reindex-gsc"
            className={getMenuItemClass(MENU_ITEMS.indexOf('menu-reindex-gsc'))}
            onClick={() => {
              onReindexGSC?.();
              closeMenu();
            }}
            disabled={!canReindexGSC || isReindexingGSC}
            role="menuitem"
            tabIndex={-1}
            title={
              isReindexingGSC
                ? 'Reindex already in progress'
                : !canReindexGSC
                  ? 'Reindex pending or dealer not eligible'
                  : undefined
            }
          >
            <svg
              className={styles.menuIcon}
              width="16"
              height="16"
              viewBox="0 0 24 24"
              fill="none"
              stroke="currentColor"
              strokeWidth="2"
            >
              <circle cx="11" cy="11" r="8" />
              <line x1="21" y1="21" x2="16.65" y2="16.65" />
              <line x1="11" y1="8" x2="11" y2="14" />
              <line x1="8" y1="11" x2="14" y2="11" />
            </svg>
            {isReindexingGSC ? 'Reindexing...' : 'Reindex with Google'}
          </button>
        </div>
      )}
    </div>
  );
}
