"use client";

import Link from "next/link";
import { useEffect, useMemo, useState } from "react";
import { ColumnDef } from "@tanstack/react-table";
import DataTable from "@/components/common/DataTable";
import CustomLoader from "@/components/common/CustomLoader";
import { toast } from "react-toastify";

interface Student {
  id: number;
  student_id: string;
  name: string;
  contact: string;
  email: string;
  email_verified: boolean;
  status: string;
}

export default function StudentsPage() {
  const [data, setData] = useState<Student[]>([]);
  const [loading, setLoading] = useState(true);
  const [togglingId, setTogglingId] = useState<number | null>(null);
  const [resendingId, setResendingId] = useState<number | null>(null);

  useEffect(() => {
    fetch("/api/admin/students")
      .then((res) => res.json())
      .then((res) => {
        setData(res.data || []);
        setLoading(false);
      })
      .catch(() => setLoading(false));
  }, []);

  const handleDelete = async (id: number) => {
    if (!confirm("Delete this student?")) return;

    const res = await fetch(`/api/admin/students/${id}`, {
      method: "DELETE",
    });

    const result = await res.json();

    if (result.success) {
      setData((prev) => prev.filter((s) => s.id !== id));
    }
  };

  const handleToggleStatus = async (student: Student) => {
    const newStatus = student.status === "active" ? "inactive" : "active";
    setTogglingId(student.id);

    try {
      const res = await fetch(`/api/admin/students/${student.id}/status`, {
        method: "PATCH",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify({ status: newStatus }),
      });

      const result = await res.json();

      if (result.success) {
        setData((prev) =>
          prev.map((s) =>
            s.id === student.id ? { ...s, status: newStatus } : s
          )
        );
        toast.success(result.message);
      } else {
        toast.error(result.message || "Failed to update status");
      }
    } catch (err) {
      toast.error("Something went wrong");
    } finally {
      setTogglingId(null);
    }
  };

  const handleResendVerification = async (student: Student) => {
    setResendingId(student.id);

    try {
      const res = await fetch(
        `/api/admin/students/${student.id}/resend-verification`,
        { method: "POST" }
      );

      const result = await res.json();

      if (result.success) {
        toast.success(result.message);
      } else {
        toast.error(result.message || "Failed to resend verification email");
      }
    } catch (err) {
      toast.error("Something went wrong");
    } finally {
      setResendingId(null);
    }
  };

  const columns = useMemo<ColumnDef<Student>[]>(
    () => [
      { accessorKey: "student_id", header: "Student ID" },
      { accessorKey: "name", header: "Name" },
      { accessorKey: "contact", header: "Contact" },
      { accessorKey: "email", header: "Email" },
      {
        header: "Status",
        cell: ({ row }) => {
          const student = row.original;
          const isActive = student.status === "active";
          const isToggling = togglingId === student.id;

          return (
            <div className="d-flex align-items-center gap-2">
              <div className="form-check form-switch m-0">
                <input
                  className="form-check-input"
                  type="checkbox"
                  role="switch"
                  checked={isActive}
                  disabled={isToggling}
                  onChange={() => handleToggleStatus(student)}
                  style={{ cursor: isToggling ? "not-allowed" : "pointer", width: "2.5em", height: "1.3em" }}
                />
              </div>
              <span
                className={`badge ${isActive ? "bg-success" : "bg-secondary"}`}
              >
                {isToggling ? "..." : isActive ? "Active" : "Inactive"}
              </span>
            </div>
          );
        },
      },
      {
        header: "Verified",
        cell: ({ row }) => {
          const student = row.original;
          const isResending = resendingId === student.id;

          return (
            <div className="d-flex align-items-center gap-2">
              <span
                className={`badge ${student.email_verified ? "bg-success" : "bg-danger"}`}
              >
                {student.email_verified ? "Yes" : "No"}
              </span>

              {!student.email_verified && (
                <button
                  onClick={() => handleResendVerification(student)}
                  disabled={isResending}
                  title="Resend verification email"
                  className="btn btn-sm table-action-btn border-0 bg-transparent p-1"
                >
                  {isResending ? (
                    <span
                      className="spinner-border spinner-border-sm"
                      role="status"
                    />
                  ) : (
                    <i className="bi bi-arrow-clockwise"></i>
                  )}
                </button>
              )}
            </div>
          );
        },
      },
      {
        header: "Actions",
        cell: ({ row }) => {
          const student = row.original;

          return (
            <div className="d-flex gap-1">
              <Link
                href={{
                  pathname: "/admin/schedule/create",
                  query: { studentId: student.id },
                }}
                className="btn btn-success btn-sm table-action-btn"
              >
                <i className="bi bi-calendar-check me-1"></i>
                Assign Slot
              </Link>
              <Link
                href={`/admin/students/view/${student.id}`}
                className="btn btn-info btn-sm table-action-btn"
              >
                <i className="bi bi-eye"></i>
              </Link>

              <Link
                href={`/admin/students/edit/${student.id}`}
                className="btn btn-warning btn-sm table-action-btn"
              >
                <i className="bi bi-pencil-square"></i>
              </Link>

              <button
                onClick={() => handleDelete(student.id)}
                className="btn btn-danger btn-sm table-action-btn"
              >
                <i className="bi bi-trash"></i>
              </button>
            </div>
          );
        },
      },
    ],
    [togglingId, resendingId]
  );

  if (loading) {
    return <CustomLoader />;
  }

  return (
    <div className="admin-page-wrapper">
      <div className="admin-page-header">
        <div className="d-flex justify-content-between align-items-center">
          <div>
            <h2 className="admin-page-title">Students</h2>
            <p className="admin-page-subtitle">Manage all registered students</p>
          </div>

          <Link href="/admin/students/create" className="admin-theme-btn">
            + Add Student
          </Link>
        </div>
      </div>
      <div className="admin-table-section">
        <DataTable columns={columns} data={data} />
      </div>
    </div>
  );
}