"use client";

import { useEffect, useState } from "react";
import Link from "next/link";
import { useRouter, usePathname } from "next/navigation";
import {
  Cpu,
  Globe,
  LogOut,
  Menu,
  X,
  User,
  ShieldCheck,
  HelpCircle,
  ChevronDown,
  Users,
  Plus,
  Loader,
} from "lucide-react";

interface Team {
  id: number;
  name: string;
  role: string;
  createdAt: string;
}

interface UserData {
  id: number;
  email: string;
  name: string | null;
  activeTeamId: number | null;
}

export default function DashboardLayout({
  children,
}: {
  children: React.ReactNode;
}) {
  const router = useRouter();
  const pathname = usePathname();
  const [user, setUser] = useState<UserData | null>(null);
  const [teams, setTeams] = useState<Team[]>([]);
  const [loading, setLoading] = useState(true);
  const [sidebarOpen, setSidebarOpen] = useState(false);

  // Team states
  const [teamDropdownOpen, setTeamDropdownOpen] = useState(false);
  const [createTeamModalOpen, setCreateTeamModalOpen] = useState(false);
  const [newTeamName, setNewTeamName] = useState("");
  const [creatingTeam, setCreatingTeam] = useState(false);
  const [teamError, setTeamError] = useState<string | null>(null);

  useEffect(() => {
    // 1. Verify session & fetch user data
    fetch("/api/auth/login")
      .then((res) => {
        if (!res.ok) {
          throw new Error("Unauthenticated");
        }
        return res.json();
      })
      .then((data) => {
        setUser(data.user);
        // 2. Fetch all teams for the user
        return fetch("/api/teams");
      })
      .then((res) => res?.json())
      .then((data) => {
        if (data && data.teams) {
          setTeams(data.teams);
        }
        setLoading(false);
      })
      .catch((err) => {
        console.error("Session verify failed:", err);
        router.push("/login");
      });
  }, [router]);

  const handleLogout = async () => {
    try {
      await fetch("/api/auth/logout", { method: "POST" });
      router.push("/login");
    } catch (err) {
      console.error("Error logging out:", err);
    }
  };

  const handleSwitchTeam = async (teamId: number) => {
    try {
      setTeamDropdownOpen(false);
      const res = await fetch("/api/teams/switch", {
        method: "POST",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify({ teamId }),
      });

      if (res.ok) {
        // Fast refresh to reload all team-scoped websites
        window.location.reload();
      } else {
        const data = await res.json();
        alert(data.error || "Failed to switch team.");
      }
    } catch (err) {
      console.error("Error switching team:", err);
    }
  };

  const handleCreateTeam = async (e: React.FormEvent) => {
    e.preventDefault();
    setTeamError(null);
    setCreatingTeam(true);

    try {
      const res = await fetch("/api/teams", {
        method: "POST",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify({ name: newTeamName }),
      });

      const data = await res.json();

      if (!res.ok) {
        throw new Error(data.error || "Failed to create team.");
      }

      setCreateTeamModalOpen(false);
      setNewTeamName("");

      // Force reload to set new team active instantly
      window.location.reload();
    } catch (err: any) {
      setTeamError(err.message || "Something went wrong.");
    } finally {
      setCreatingTeam(false);
    }
  };

  if (loading) {
    return (
      <div className="min-h-screen bg-white flex items-center justify-center">
        <div className="flex flex-col items-center gap-3">
          <div className="h-10 w-10 rounded-xl bg-blue-600 flex items-center justify-center animate-bounce">
            <Cpu className="h-6 w-6 text-white" />
          </div>
          <span className="text-xs font-semibold text-slate-400 animate-pulse">
            Loading RemotePress Portal...
          </span>
        </div>
      </div>
    );
  }

  const activeTeam = teams.find((t) => t.id === user?.activeTeamId);
  const inactiveTeams = teams.filter((t) => t.id !== user?.activeTeamId);

  const navLinks = [{ name: "Websites", href: "/websites", icon: Globe }];

  return (
    <div className="min-h-screen bg-white text-slate-800 flex relative">
      {/* Mobile Sidebar Overlay */}
      {sidebarOpen && (
        <div
          className="fixed inset-0 z-40 bg-slate-900/35 backdrop-blur-sm lg:hidden transition-opacity"
          onClick={() => setSidebarOpen(false)}
        />
      )}

      {/* Left side drawer menu (locked fixed sidebar) */}
      <aside
        className={`fixed inset-y-0 left-0 z-40 w-64 bg-white border-r border-slate-200 flex flex-col justify-between transform transition-transform duration-300 ease-in-out md:translate-x-0 ${
          sidebarOpen ? "translate-x-0" : "-translate-x-full"
        }`}
      >
        <div className="flex flex-col">
          {/* Logo Section */}
          <div className="h-16 border-b border-slate-200 px-6 flex items-center justify-between">
            <Link href="/websites" className="flex items-center gap-2">
              <div className="h-8 w-8 rounded-lg bg-blue-600 flex items-center justify-center">
                <Cpu className="h-4.5 w-4.5 text-white" />
              </div>
              <span className="font-bold text-lg text-slate-900">
                RemotePress
              </span>
            </Link>
            <button
              onClick={() => setSidebarOpen(false)}
              className="p-1 rounded text-slate-400 hover:text-slate-600 md:hidden"
            >
              <X className="h-5 w-5" />
            </button>
          </div>

          {/* Premium Team Selector Dropdown */}
          <div className="px-4 py-3.5 border-b border-slate-200 relative z-35">
            <button
              onClick={() => setTeamDropdownOpen(!teamDropdownOpen)}
              className="w-full flex items-center justify-between px-3 py-2 rounded-xl bg-slate-50 hover:bg-slate-100 border border-slate-200 transition-all text-left"
            >
              <div className="flex items-center gap-2.5 overflow-hidden">
                <div className="w-7 h-7 rounded-lg bg-indigo-600 flex items-center justify-center shrink-0">
                  <Users className="h-4 w-4 text-white" />
                </div>
                <div className="overflow-hidden">
                  <p className="text-[9px] text-slate-400 font-bold tracking-wider uppercase leading-none">
                    Active Team
                  </p>
                  <p className="text-xs font-bold text-slate-800 truncate mt-0.5">
                    {activeTeam?.name || "Loading Team..."}
                  </p>
                </div>
              </div>
              <ChevronDown
                className={`h-4 w-4 text-slate-400 transition-transform ${teamDropdownOpen ? "rotate-180" : ""}`}
              />
            </button>

            {/* Selector Dropdown Panel */}
            {teamDropdownOpen && (
              <>
                <div
                  className="fixed inset-0 z-10"
                  onClick={() => setTeamDropdownOpen(false)}
                />
                <div className="absolute top-[52px] left-4 right-4 z-20 mt-1.5 p-2 rounded-xl bg-white border border-slate-200 shadow-lg space-y-1">
                  <p className="text-[9px] font-bold text-slate-400 px-2 py-1 uppercase tracking-wider">
                    Switch Teams
                  </p>

                  {/* Current Active Team Checked */}
                  <div className="flex items-center justify-between px-2.5 py-2 rounded-lg bg-slate-100 border border-slate-200 text-slate-900 text-xs font-bold">
                    <span className="truncate">{activeTeam?.name}</span>
                    <span className="w-1.5 h-1.5 rounded-full bg-slate-900" />
                  </div>

                  {/* Other Teams */}
                  <div className="max-h-32 overflow-y-auto space-y-0.5">
                    {inactiveTeams.map((team) => (
                      <button
                        key={team.id}
                        onClick={() => handleSwitchTeam(team.id)}
                        className="w-full text-left px-2.5 py-2 rounded-lg text-xs text-slate-500 hover:text-slate-800 hover:bg-slate-50 transition-all truncate"
                      >
                        {team.name}
                      </button>
                    ))}
                  </div>

                  {/* Create Team Action Button */}
                  <button
                    onClick={() => {
                      setTeamDropdownOpen(false);
                      setCreateTeamModalOpen(true);
                    }}
                    className="w-full flex items-center justify-center gap-1.5 mt-2 pt-2 border-t border-slate-100 px-2 py-1.5 rounded-lg text-[11px] font-bold text-blue-600 hover:text-blue-700 hover:bg-blue-50 transition-all"
                  >
                    <Plus className="h-3.5 w-3.5" /> Create New Team
                  </button>
                </div>
              </>
            )}
          </div>

          {/* Navigation Links */}
          <nav className="p-4 space-y-1 flex-grow">
            {navLinks.map((link) => {
              const Icon = link.icon;
              const isActive = pathname.startsWith(link.href);
              return (
                <Link
                  key={link.name}
                  href={link.href}
                  className={`flex items-center gap-3 px-4 py-2.5 rounded-xl text-sm font-semibold transition-all ${
                    isActive
                      ? "bg-slate-100 text-slate-900 border-l-2 border-slate-900"
                      : "text-slate-500 hover:text-slate-900 hover:bg-slate-50 border-l-2 border-transparent"
                  }`}
                  onClick={() => setSidebarOpen(false)}
                >
                  <Icon className="h-4.5 w-4.5" />
                  {link.name}
                </Link>
              );
            })}
          </nav>
        </div>

        {/* Sidebar Footer User Details */}
        <div className="p-4 border-t border-slate-200 bg-slate-50/50">
          <div className="flex items-center gap-3 p-2.5 rounded-xl bg-white border border-slate-200 mb-3">
            <div className="w-9 h-9 rounded-lg bg-slate-100 flex items-center justify-center border border-slate-200 shrink-0">
              <User className="h-5 w-5 text-slate-500" />
            </div>
            <div className="overflow-hidden">
              <p className="text-xs font-bold text-slate-800 truncate">
                {user?.name || "Account Holder"}
              </p>
              <p className="text-[10px] text-slate-400 truncate">
                {user?.email}
              </p>
            </div>
          </div>

          <button
            onClick={handleLogout}
            className="w-full flex items-center justify-center gap-2 px-4 py-2.5 rounded-xl text-sm font-semibold bg-white text-red-600 border border-slate-200 hover:bg-red-50 hover:border-red-200 transition-all cursor-pointer"
          >
            <LogOut className="h-4 w-4" />
            Sign Out
          </button>
        </div>
      </aside>

      {/* Main Content Area */}
      <div className="flex-1 flex flex-col min-w-0 md:pl-64">
        {/* Dynamic page container */}
        <main className="flex-grow p-6 md:p-8 overflow-y-auto relative z-10">
          <div className="max-w-7xl mx-auto">{children}</div>
        </main>
      </div>

      {/* GLASSMORPHIC CREATE TEAM DIALOG MODAL */}
      {createTeamModalOpen && (
        <div className="fixed inset-0 z-50 flex items-center justify-center p-4 bg-slate-900/40 backdrop-blur-sm animate-fadeIn">
          <div className="w-full max-w-sm bg-white border border-slate-200 rounded-2xl shadow-lg p-6 relative">
            <button
              onClick={() => setCreateTeamModalOpen(false)}
              className="absolute top-4 right-4 p-1.5 rounded-lg text-slate-400 hover:text-slate-600 bg-slate-50 hover:bg-slate-100 transition-colors"
            >
              <Plus className="h-5 w-5 rotate-45" />
            </button>

            {teamError && (
              <div className="mb-4 p-3 rounded-lg bg-red-50 border border-red-200 text-xs text-red-650">
                {teamError}
              </div>
            )}

            <form onSubmit={handleCreateTeam} className="space-y-4">
              <div>
                <h3 className="text-lg font-bold text-slate-950 flex items-center gap-2">
                  <Users className="h-5 w-5 text-blue-600" /> Create New Team
                </h3>
                <p className="text-xs text-slate-500 mt-1">
                  Setup an organizational team workspace
                </p>
              </div>

              <div>
                <label
                  htmlFor="teamName"
                  className="block text-[10px] font-bold text-slate-400 mb-1.5 uppercase tracking-wider"
                >
                  Team Name
                </label>
                <input
                  id="teamName"
                  type="text"
                  required
                  placeholder="e.g. Acme Corp Devs"
                  className="glass-input w-full py-2.5 px-4 rounded-xl text-xs"
                  value={newTeamName}
                  onChange={(e) => setNewTeamName(e.target.value)}
                />
              </div>

              <div className="flex justify-end gap-2.5 pt-2">
                <button
                  type="button"
                  onClick={() => setCreateTeamModalOpen(false)}
                  className="px-4 py-2 text-xs font-semibold text-slate-400 hover:text-slate-600"
                >
                  Cancel
                </button>
                <button
                  type="submit"
                  disabled={creatingTeam || !newTeamName.trim()}
                  className="px-4 py-2 text-xs font-bold text-white bg-slate-900 hover:bg-slate-800 rounded-xl disabled:opacity-50 flex items-center gap-1"
                >
                  {creatingTeam ? (
                    <>
                      <Loader className="h-3.5 w-3.5 animate-spin" />{" "}
                      Creating...
                    </>
                  ) : (
                    <>Create Team</>
                  )}
                </button>
              </div>
            </form>
          </div>
        </div>
      )}
    </div>
  );
}
