import { createFileRoute } from "@tanstack/react-router";
import { AppManagerTemplate } from "@/template/app-manager-template";
import {
  useGetAgentVersion,
  useGetRoomList,
  useUploadSoftware,
  useUpdateAgent,
} from "@/hooks/queries";
import { toast } from "sonner";
import type { ColumnDef } from "@tanstack/react-table";
import type { AxiosProgressEvent } from "axios";
import type { Version } from "@/types/file";

export const Route = createFileRoute("/_auth/agent/")({
  head: () => ({ meta: [{ title: "Quản lý Agent" }] }),
  component: AgentsPage,
});

function AgentsPage() {
  // Lấy danh sách version
  const { data, isLoading } = useGetAgentVersion();

  // Lấy danh sách phòng
  const { data: roomData } = useGetRoomList();

  const versionList: Version[] = Array.isArray(data)
    ? data
    : data
      ? [data]
      : [];

  const uploadMutation = useUploadSoftware();

  const updateMutation = useUpdateAgent();

  const handleUpload = async (
    fd: FormData,
    config?: { onUploadProgress?: (e: AxiosProgressEvent) => void }
  ) => {
    try {
      await uploadMutation.mutateAsync({
        formData: fd,
        onUploadProgress: config?.onUploadProgress,
      });
      toast.success("Upload thành công!");
    } catch (error: any) {
      console.error("Upload error:", error);
      toast.error("Upload thất bại!");
    }
  };

  const handleUpdate = async (roomNames: string[]) => {
    try {
      for (const roomName of roomNames) {
        await updateMutation.mutateAsync({
          roomName,
          data: {}
        });
      }
      toast.success("Đã gửi yêu cầu update cho các phòng đã chọn!");
    } catch (e) {
      toast.error("Có lỗi xảy ra khi cập nhật!");
    }
  };

  // Cột bảng
  const columns: ColumnDef<Version>[] = [
    { accessorKey: "version", header: "Phiên bản" },
    { accessorKey: "fileName", header: "Tên file" },
    { accessorKey: "folderPath", header: "Đường dẫn" },
    {
      accessorKey: "updatedAt",
      header: "Thời gian cập nhật",
      cell: ({ getValue }) =>
        getValue()
          ? new Date(getValue() as string).toLocaleString("vi-VN")
          : "N/A",
    },
    {
      accessorKey: "requestUpdateAt",
      header: "Thời gian yêu cầu cập nhật",
      cell: ({ getValue }) =>
        getValue()
          ? new Date(getValue() as string).toLocaleString("vi-VN")
          : "N/A",
    },
  ];

  return (
    <AppManagerTemplate<Version>
      title="Quản lý Agent"
      description="Quản lý và theo dõi các phiên bản Agent"
      data={versionList}
      isLoading={isLoading}
      columns={columns}
      onUpload={handleUpload}
      onUpdate={handleUpdate}
      updateLoading={updateMutation.isPending}
      rooms={roomData}
    />
  );
}
