import type { Context } from "hono";
import { insertAdminLog } from "./adminLog.helper";
import {
  fetchFromPythonApi,
  proxyToPythonApi,
  proxyMultipartToPythonApi,
} from "@/lib/chatbot/python-api.client";

export const createAgentHandler = async (c: Context) => {
  const coreDB = c.get("datastore");
  const body = await c.req.json();
  const { response, payload, ok } = await proxyToPythonApi(
    c,
    "/api/v1/admin-console/chatbot/agents",
    "POST",
    undefined,
    body,
  );

  if (ok && payload.data) {
    await insertAdminLog(coreDB, {
      entity_type: "agent",
      entity_id: payload.data.id,
      action: "create",
      performed_by: c.get("adminEmail") ?? "admin",
      before_data: null,
      after_data: payload.data,
    });
  }

  return response;
};

export const updateAgentHandler = async (c: Context) => {
  const coreDB = c.get("datastore");
  const { id } = c.req.param();
  const body = await c.req.json();
  const performedBy = c.get("adminEmail") ?? "admin";

  const beforeState = await fetchFromPythonApi(
    c,
    `/api/v1/admin-console/chatbot/agents/${id}`,
  );

  const { response, payload, ok } = await proxyToPythonApi(
    c,
    `/api/v1/admin-console/chatbot/agents/${id}`,
    "PUT",
    undefined,
    body,
  );

  if (ok && payload.data) {
    await insertAdminLog(coreDB, {
      entity_type: "agent",
      entity_id: id,
      action: "update",
      performed_by: performedBy,
      before_data: beforeState.success ? beforeState.data : null,
      after_data: payload.data,
    });
  }

  return response;
};

export const deleteAgentHandler = async (c: Context) => {
  const coreDB = c.get("datastore");
  const { id } = c.req.param();
  const performedBy = c.get("adminEmail") ?? "admin";

  const beforeState = await fetchFromPythonApi(
    c,
    `/api/v1/admin-console/chatbot/agents/${id}`,
  );

  const { response, ok } = await proxyToPythonApi(
    c,
    `/api/v1/admin-console/chatbot/agents/${id}`,
    "DELETE",
  );

  if (ok && beforeState.success) {
    await insertAdminLog(coreDB, {
      entity_type: "agent",
      entity_id: id,
      action: "delete",
      performed_by: performedBy,
      before_data: beforeState.data,
      after_data: null,
    });
  }

  return response;
};

export const listAgentsHandler = async (c: Context) => {
  const start = c.req.query("start") ?? "0";
  const limit = c.req.query("limit") ?? "10";
  const activeOnly = c.req.query("active_only");
  const query: Record<string, string> = { start, limit };
  if (activeOnly) query.active_only = activeOnly;
  const { response } = await proxyToPythonApi(
    c,
    "/api/v1/admin-console/chatbot/agents",
    "GET",
    query,
  );
  return response;
};

export const getAgentByIdHandler = async (c: Context) => {
  const { id } = c.req.param();
  const { response } = await proxyToPythonApi(
    c,
    `/api/v1/admin-console/chatbot/agents/${id}`,
    "GET",
  );
  return response;
};

export const testAgentHandler = async (c: Context) => {
  const body = await c.req.json();
  const { response } = await proxyToPythonApi(
    c,
    "/api/v1/admin-console/chatbot/agents/test",
    "POST",
    undefined,
    body,
  );
  return response;
};

export const getGlobalAgentHandler = async (c: Context) => {
  const { response } = await proxyToPythonApi(
    c,
    "/api/v1/admin-console/chatbot/global-agent",
    "GET",
  );
  return response;
};

export const updateGlobalAgentHandler = async (c: Context) => {
  const coreDB = c.get("datastore");
  const body = await c.req.json();
  const performedBy = c.get("adminEmail") ?? "admin";

  const beforeState = await fetchFromPythonApi(
    c,
    "/api/v1/admin-console/chatbot/global-agent",
  );

  const { response, payload, ok } = await proxyToPythonApi(
    c,
    "/api/v1/admin-console/chatbot/global-agent",
    "PUT",
    undefined,
    body,
  );

  if (ok && payload?.data) {
    await insertAdminLog(coreDB, {
      entity_type: "agent",
      entity_id: payload.data.id,
      action: "update",
      performed_by: performedBy,
      before_data: beforeState.success ? beforeState.data : null,
      after_data: payload.data,
    });
  }

  return response;
};

export const uploadFilesHandler = async (c: Context) => {
  const { response } = await proxyMultipartToPythonApi(
    c,
    "/api/v1/admin-console/chatbot/upload",
  );
  return response;
};

export const makeAgentGlobalHandler = async (c: Context) => {
  const coreDB = c.get("datastore");
  const { id } = c.req.param();
  const performedBy = c.get("adminEmail") ?? "admin";

  const beforeState = await fetchFromPythonApi(
    c,
    `/api/v1/admin-console/chatbot/agents/${id}`,
  );

  const { response, payload, ok } = await proxyToPythonApi(
    c,
    `/api/v1/admin-console/chatbot/agents/${id}/make-global`,
    "PATCH",
  );

  if (ok && payload?.data) {
    await insertAdminLog(coreDB, {
      entity_type: "agent",
      entity_id: id,
      action: "update",
      performed_by: performedBy,
      before_data: beforeState.success ? beforeState.data : null,
      after_data: payload.data,
    });
  }

  return response;
};

export const toggleAgentHandler = async (c: Context) => {
  const coreDB = c.get("datastore");
  const { id } = c.req.param();
  const performedBy = c.get("adminEmail") ?? "admin";

  const beforeState = await fetchFromPythonApi(
    c,
    `/api/v1/admin-console/chatbot/agents/${id}`,
  );

  const { response, payload, ok } = await proxyToPythonApi(
    c,
    `/api/v1/admin-console/chatbot/agents/${id}/toggle`,
    "PATCH",
  );

  if (ok && payload?.data) {
    await insertAdminLog(coreDB, {
      entity_type: "agent",
      entity_id: id,
      action: "update",
      performed_by: performedBy,
      before_data: beforeState.success ? beforeState.data : null,
      after_data: payload.data,
    });
  }

  return response;
};
