/**
 * Parameter definition for tool parameters.
 */
export interface ParameterDef {
  type: "string" | "number" | "boolean" | "object" | "array";
  description?: string;
  enum?: string[];
}

/**
 * Provider-agnostic tool definition format.
 * Can be converted to OpenAI, Claude, or other provider formats.
 */
export interface ToolDefinition {
  name: string;
  description: string;
  parameters: {
    type: "object";
    properties: Record<string, ParameterDef>;
    required: string[];
  };
}

/**
 * All available tools for the calendar assistant.
 */
export const TOOL_DEFINITIONS: ToolDefinition[] = [
  {
    name: "getDay",
    description:
      "Get a date for a specific weekday relative to today. Returns an ISO date string.",
    parameters: {
      type: "object",
      properties: {
        day: {
          type: "string",
          enum: [
            "Monday",
            "Tuesday",
            "Wednesday",
            "Thursday",
            "Friday",
            "Saturday",
            "Sunday",
          ],
          description: "The target weekday",
        },
        offset: {
          type: "number",
          description:
            "1 = next occurrence, 2 = the one after, -1 = last occurrence, etc.",
        },
        hour: {
          type: "number",
          description: "Hour of day (0-23)",
        },
        minute: {
          type: "number",
          description: "Minute (0-59)",
        },
      },
      required: ["day", "offset", "hour", "minute"],
    },
  },
  {
    name: "getCurrentDateTime",
    description: "Get the current date and time as an ISO string",
    parameters: {
      type: "object",
      properties: {},
      required: [],
    },
  },
  {
    name: "proposeCreateEvent",
    description:
      "Propose creating a new calendar event. The user must confirm before it's saved. Call this when the user wants to create a new appointment.",
    parameters: {
      type: "object",
      properties: {
        title: {
          type: "string",
          description: "Event title",
        },
        startTime: {
          type: "string",
          description: "Start time as ISO date string",
        },
        endTime: {
          type: "string",
          description: "End time as ISO date string",
        },
        description: {
          type: "string",
          description: "Optional event description",
        },
        recurrenceRule: {
          type: "string",
          description: "RRULE format string for recurring events",
        },
      },
      required: ["title", "startTime", "endTime"],
    },
  },
  {
    name: "proposeUpdateEvent",
    description:
      "Propose updating an existing event. The user must confirm. Use this when the user wants to modify an appointment.",
    parameters: {
      type: "object",
      properties: {
        eventId: {
          type: "string",
          description: "ID of the event to update",
        },
        title: {
          type: "string",
          description: "New title (optional)",
        },
        startTime: {
          type: "string",
          description: "New start time as ISO date string (optional)",
        },
        endTime: {
          type: "string",
          description: "New end time as ISO date string (optional)",
        },
        description: {
          type: "string",
          description: "New description (optional). NEVER put RRULE here!",
        },
        recurrenceRule: {
          type: "string",
          description:
            "RRULE format string (optional). Use to add UNTIL or modify recurrence. Format: FREQ=DAILY;UNTIL=20260310T000000Z",
        },
      },
      required: ["eventId"],
    },
  },
  {
    name: "proposeDeleteEvent",
    description:
      "Propose deleting an event. The user must confirm. Use this when the user wants to remove an appointment. For recurring events, specify deleteMode to control which occurrences to delete.",
    parameters: {
      type: "object",
      properties: {
        eventId: {
          type: "string",
          description: "ID of the event to delete",
        },
        deleteMode: {
          type: "string",
          enum: ["single", "future", "all"],
          description:
            "For recurring events: 'single' = only this occurrence, 'future' = this and all future, 'all' = entire recurring event. Defaults to 'all' for non-recurring events.",
        },
        occurrenceDate: {
          type: "string",
          description:
            "ISO date string (YYYY-MM-DD) of the specific occurrence to delete. Required for 'single' and 'future' modes.",
        },
      },
      required: ["eventId"],
    },
  },
  {
    name: "searchEvents",
    description:
      "Search for events by title in the user's calendar. Returns matching events.",
    parameters: {
      type: "object",
      properties: {
        query: {
          type: "string",
          description: "Search query to match against event titles",
        },
      },
      required: ["query"],
    },
  },
  {
    name: "getEventsInRange",
    description:
      "Load events from a specific date range. Use this when the user asks about a time period beyond the default 4 weeks (e.g., 'birthdays in the next 6 months', 'what do I have planned for summer').",
    parameters: {
      type: "object",
      properties: {
        startDate: {
          type: "string",
          description: "Start date as ISO string (YYYY-MM-DD)",
        },
        endDate: {
          type: "string",
          description: "End date as ISO string (YYYY-MM-DD)",
        },
      },
      required: ["startDate", "endDate"],
    },
  },
];
