import { z } from 'zod';
import * as ticketQ from '@/server/db/queries/support-tickets.js';
import * as actionsQ from '@/server/db/queries/support/ai-actions.js';
import type { SupportTool, ToolResult } from './_types.js';
import type { AgentDeps } from '../types.js';

const inputSchema = z.object({
  ticketId: z.uuid(),
  resolution: z.string().min(1).max(1000),
});

type Output = { closed: true };

async function impl(deps: AgentDeps, rawInput: unknown): Promise<ToolResult<Output>> {
  const parsed = inputSchema.safeParse(rawInput);
  if (!parsed.success) return { ok: false, error: `INVALID_INPUT:${parsed.error.message}` };

  // Only for tickets
  if (deps.parent.type !== 'ticket') {
    return { ok: false, error: 'AUTONOMY_GATE:close_ticket_only_for_tickets' };
  }

  const { ticketId, resolution } = parsed.data;

  const ticket = await ticketQ.findById(deps.db, ticketId);
  if (!ticket) return { ok: false, error: 'NOT_FOUND:ticket' };

  const terminalStatuses = ['resolved', 'closed'];
  if (terminalStatuses.includes(ticket.status)) {
    return { ok: false, error: 'AUTONOMY_GATE:ticket_already_terminal' };
  }

  await deps.db.transaction(async (tx) =>
    actionsQ.closeTicket(tx, ticketId, ticket.status, resolution, ticket.metadata),
  );

  deps.runState.decision = 'auto';

  return { ok: true, data: { closed: true } };
}

export const closeTicketTool = {
  name: 'close_ticket',
  inputSchema,
  impl,
} satisfies SupportTool<'close_ticket', z.infer<typeof inputSchema>, Output>;
