'use client';

import { useState } from 'react';
import { X, Shield, UserPlus, User, Trash2, Tag, Plus, AlertTriangle, LogOut, Layers } from 'lucide-react';
import { inventoryApi } from '@/lib/api';
import { toast } from 'react-hot-toast';
import CreateUserModal from './CreateUserModal';
import ConfirmationModal from './ConfirmationModal';
import CategoryCreationModal from './CategoryCreationModal';

interface AdminOverlayProps {
  show: boolean;
  onClose: () => void;
  users: any[];
  categories: any[];
  onUpdateUsers: (users: any[]) => void;
  onUpdateCategories: (categories: any[]) => void;
}

export default function AdminOverlay({
  show,
  onClose,
  users,
  categories,
  onUpdateUsers,
  onUpdateCategories
}: AdminOverlayProps) {
  const [showCreateUserModal, setShowCreateUserModal] = useState(false);
  const [showCreateCategoryModal, setShowCreateCategoryModal] = useState(false);
  const [confirmState, setConfirmState] = useState<{
    show: boolean;
    type: 'user' | 'category' | null;
    itemId?: number;
    itemName?: string;
    affectedCount?: number;
    loading?: boolean;
  }>({
    show: false,
    type: null,
    loading: false,
  });

  if (!show) return null;

  const handleUserCreated = () => {
    inventoryApi.getUsers().then(onUpdateUsers);
  };

  const handleCategoryCreated = () => {
    inventoryApi.getCategories().then(onUpdateCategories);
  };

  const handleDeleteUser = async () => {
    if (!confirmState.itemId) return;
    setConfirmState(prev => ({ ...prev, loading: true }));
    try {
      await inventoryApi.deleteUser(confirmState.itemId);
      toast.success("User removed");
      await inventoryApi.getUsers().then(onUpdateUsers);
      setConfirmState({ show: false, type: null, loading: false });
    } catch (error) {
      toast.error("Delete failed");
      setConfirmState(prev => ({ ...prev, loading: false }));
    }
  };

  const handleDeleteCategory = async () => {
    if (!confirmState.itemId) return;
    setConfirmState(prev => ({ ...prev, loading: true }));
    try {
      await inventoryApi.deleteCategory(confirmState.itemId);
      toast.success("Category removed");
      await inventoryApi.getCategories().then(onUpdateCategories);
      setConfirmState({ show: false, type: null, loading: false });
    } catch (error: any) {
      toast.error(error?.response?.data?.detail || "Delete failed");
      setConfirmState(prev => ({ ...prev, loading: false }));
    }
  };

  return (
    <>
      <CreateUserModal
        show={showCreateUserModal}
        onClose={() => setShowCreateUserModal(false)}
        onUserCreated={handleUserCreated}
      />
      <CategoryCreationModal
        show={showCreateCategoryModal}
        onClose={() => setShowCreateCategoryModal(false)}
        onCategoryCreated={handleCategoryCreated}
      />
      <ConfirmationModal
        show={confirmState.show && confirmState.type === 'user'}
        title={`Delete User: ${confirmState.itemName}?`}
        description="This will remove the user from the system. The audit log will remain."
        itemName={confirmState.itemName}
        consequence="This cannot be undone."
        onConfirm={handleDeleteUser}
        onCancel={() => setConfirmState({ show: false, type: null, loading: false })}
        loading={confirmState.loading}
        dangerLevel="medium"
      />
      <ConfirmationModal
        show={confirmState.show && confirmState.type === 'category'}
        title={`Delete Category: ${confirmState.itemName}?`}
        description="This will remove the category from the system."
        itemName={confirmState.itemName}
        affectedCount={confirmState.affectedCount}
        consequence="This cannot be undone. Audit logs will remain."
        onConfirm={handleDeleteCategory}
        onCancel={() => setConfirmState({ show: false, type: null, loading: false })}
        loading={confirmState.loading}
        dangerLevel={confirmState.affectedCount && confirmState.affectedCount > 10 ? 'high' : 'medium'}
      />
      <div data-testid="admin-overlay" className="fixed inset-0 z-50 bg-surface-container-lowest/80 animate-in fade-in duration-300">
      <div className="absolute inset-y-0 right-0 w-full max-w-md sm:max-w-lg md:max-w-md level-0 border-l border-border shadow-none flex flex-col animate-in slide-in-from-right duration-500">
        <div className="p-3 md:p-6 border-b border-border flex items-center justify-between">
          <div className="flex items-center gap-3">
            <div className="p-2 bg-surface-container-lowest text-primary border border-border">
              <Shield size={20} />
            </div>
            <h2 className="text-xl font-normal text-white">System Admin</h2>
          </div>
          <button
            data-testid="close-admin-overlay"
            onClick={onClose}
            className="p-2 hover:bg-surface-container-lowest border border-transparent hover:border-border transition-colors text-secondary focus-visible:ring-2 focus-visible:ring-primary focus-visible:outline-none"
            aria-label="Close"
          >
            <X size={20} />
          </button>
        </div>
        
        <div className="flex-1 overflow-y-auto p-3 md:p-6 space-y-3 md:space-y-4">
          <section className="space-y-2 md:space-y-3">
            <div className="flex items-center justify-between">
              <div>
                <h3 className="text-sm font-normal text-secondary">User Management</h3>
                <p className="text-xs text-secondary mt-0.5">Create accounts and control access</p>
              </div>
              <button
                onClick={() => setShowCreateUserModal(true)}
                className="flex items-center gap-1 text-xs font-normal text-primary hover:text-primary/80 focus-visible:ring-2 focus-visible:ring-primary focus-visible:outline-none px-1"
              >
                <UserPlus size={12} /> Add User
              </button>
            </div>
            
            <div className="grid gap-1.5 md:gap-2">
              {users.map(u => (
                <div key={u.id} className="bg-transparent border border-border p-3 md:p-4 flex items-center justify-between transition-colors hover:border-muted">
                  <div className="flex items-center gap-2 md:gap-3">
                    <div className={`p-2 ${u.role === 'admin' ? "bg-primary/20 text-primary border border-primary/30" : "bg-surface-container-lowest text-secondary border border-border"}`}>
                      <User size={16} />
                    </div>
                    <div>
                      <p className="text-sm font-normal text-white">{u.username}</p>
                      <p className="text-xs font-normal text-secondary">{u.role}</p>
                    </div>
                  </div>
                  
                  {u.username !== 'Admin' && (
                    <button
                      onClick={() => {
                        setConfirmState({
                          show: true,
                          type: 'user',
                          itemId: u.id,
                          itemName: u.username,
                          loading: false,
                        });
                      }}
                      className="p-2 text-error hover:bg-error/10 transition-all focus-visible:ring-2 focus-visible:ring-rose-500 focus-visible:outline-none"
                      aria-label={`Delete user ${u.username}`}
                    >
                      <Trash2 size={16} />
                    </button>
                  )}
                </div>
              ))}
            </div>
          </section>

          <section className="space-y-2 md:space-y-3">
            <div className="flex items-center justify-between">
              <div>
                <h3 className="text-sm font-normal text-secondary">Category Groups</h3>
                <p className="text-xs text-secondary mt-0.5">Organize items by type or location</p>
              </div>
              <button
                onClick={() => setShowCreateCategoryModal(true)}
                className="flex items-center gap-1 text-xs font-normal text-primary hover:text-primary/80 focus-visible:ring-2 focus-visible:ring-primary focus-visible:outline-none px-1"
              >
                <Plus size={12} /> Add Category
              </button>
            </div>

            <div className="grid gap-1.5 md:gap-2">
              {categories.map(cat => (
                <div key={cat.id} className="bg-transparent border border-border p-3 md:p-4 flex items-center justify-between transition-colors hover:border-muted">
                  <div className="flex items-center gap-2 md:gap-3">
                    <div className="p-2 bg-primary/10 text-primary border border-primary/20">
                      <Layers size={16} />
                    </div>
                    <div>
                      <p className="text-sm font-normal text-white">{cat.name}</p>
                      <p className="text-xs text-secondary font-mono">{cat.description || 'No description'}</p>
                    </div>
                  </div>
                  
                  <button
                     onClick={() => {
                       setConfirmState({
                         show: true,
                         type: 'category',
                         itemId: cat.id,
                         itemName: cat.name,
                         affectedCount: 0, // TODO: fetch actual count from backend
                         loading: false,
                       });
                     }}
                     className="p-2 text-error hover:bg-error/10 transition-all focus-visible:ring-2 focus-visible:ring-rose-500 focus-visible:outline-none"
                     aria-label={`Delete category ${cat.name}`}
                  >
                     <Trash2 size={16} />
                  </button>
                </div>
              ))}
            </div>
          </section>

          <section className="p-4 md:p-6 level-1 space-y-2 md:space-y-3">
            <div className="flex items-center gap-2 text-error">
              <AlertTriangle size={16} />
              <p className="text-sm font-normal">Sign Out</p>
            </div>
            <p className="text-xs text-secondary">End your session and return to the login screen.</p>
            <button
              onClick={() => {
                import('@/lib/auth').then(m => m.clearAuth());
                window.location.href = '/login';
              }}
              className="w-full bg-error/10 hover:bg-error/20 text-error border border-error/20 font-normal py-3 transition-all flex items-center justify-center gap-2 focus-visible:ring-2 focus-visible:ring-rose-500 focus-visible:outline-none"
            >
              <LogOut size={16} /> Sign Out
            </button>
          </section>
        </div>
      </div>
      </div>
    </>
  );
}
