/**
 * WordPress Posts Tool Definitions
 *
 * Defines all MCP tool schemas for WordPress post management.
 * This module separates tool definitions from their implementations
 * for better maintainability and testing.
 */

import type { MCPTool } from "@/types/mcp.js";

/**
 * Tool definition for listing WordPress posts
 */
export const listPostsTool: MCPTool = {
  name: "wp_list_posts",
  description:
    "Lists posts from a WordPress site with comprehensive filtering options. Supports search, status filtering, and category/tag filtering with enhanced metadata display.\n\n" +
    "**Usage Examples:**\n" +
    "• Basic listing: `wp_list_posts`\n" +
    '• Search posts: `wp_list_posts --search="AI trends"`\n' +
    '• Filter by status: `wp_list_posts --status="draft"`\n' +
    "• Category filtering: `wp_list_posts --categories=[1,2,3]`\n" +
    "• Paginated results: `wp_list_posts --per_page=20 --page=2`\n" +
    '• Combined filters: `wp_list_posts --search="WordPress" --status="publish" --per_page=10`',
  inputSchema: {
    type: "object",
    properties: {
      per_page: {
        type: "number",
        description: "Number of items to return per page (max 100).",
      },
      search: {
        type: "string",
        description: "Limit results to those matching a search term.",
      },
      status: {
        type: "string",
        description: "Filter by post status.",
        enum: ["publish", "future", "draft", "pending", "private"],
      },
      categories: {
        type: "array",
        items: { type: "number" },
        description: "Limit results to posts in specific category IDs.",
      },
      tags: {
        type: "array",
        items: { type: "number" },
        description: "Limit results to posts with specific tag IDs.",
      },
    },
  },
};

/**
 * Tool definition for retrieving a single WordPress post
 */
export const getPostTool: MCPTool = {
  name: "wp_get_post",
  description:
    "Retrieves detailed information about a single post including metadata, content statistics, and management links. Optionally includes full HTML content for editing.\n\n" +
    "**Usage Examples:**\n" +
    "• Basic metadata: `wp_get_post --id=123`\n" +
    "• With full content: `wp_get_post --id=123 --include_content=true`",
  inputSchema: {
    type: "object",
    properties: {
      id: {
        type: "number",
        description: "The unique identifier for the post.",
      },
      include_content: {
        type: "boolean",
        description: "If true, includes the full HTML content of the post for editing. Default: false",
      },
    },
    required: ["id"],
  },
};

/**
 * Tool definition for creating a new WordPress post
 */
export const createPostTool: MCPTool = {
  name: "wp_create_post",
  description:
    "Creates a new WordPress post with comprehensive validation and detailed success feedback including management links.\n\n" +
    "**Usage Examples:**\n" +
    '• Simple post: `wp_create_post --title="My New Post" --content="<p>Hello World!</p>"`\n' +
    '• Draft post: `wp_create_post --title="Draft Post" --status="draft"`\n' +
    '• Categorized post: `wp_create_post --title="Tech News" --categories=[1,5] --tags=[10,20]`\n' +
    '• Post with featured image: `wp_create_post --title="My Post" --content="<p>Content</p>" --featured_media=42`\n' +
    '• Remove featured image: `wp_create_post --title="My Post" --featured_media=0`\n' +
    '• Scheduled post: `wp_create_post --title="Future Post" --status="future" --date="2024-12-25T10:00:00"`\n' +
    '• Complete post: `wp_create_post --title="Complete Post" --content="<p>Content</p>" --excerpt="Summary" --status="publish"`',
  inputSchema: {
    type: "object",
    properties: {
      title: {
        type: "string",
        description: "The title for the post.",
      },
      content: {
        type: "string",
        description: "The content for the post, in HTML format.",
      },
      status: {
        type: "string",
        description: "The publishing status for the post.",
        enum: ["publish", "draft", "pending", "private"],
      },
      excerpt: {
        type: "string",
        description: "The excerpt for the post.",
      },
      categories: {
        type: "array",
        items: { type: "number" },
        description: "An array of category IDs to assign to the post.",
      },
      tags: {
        type: "array",
        items: { type: "number" },
        description: "An array of tag IDs to assign to the post.",
      },
      featured_media: {
        type: "number",
        description: "The ID of the featured media (image). Use 0 to remove featured media.",
      },
      date: {
        type: "string",
        description: "The date the post was published, in the site's timezone (ISO 8601 format).",
      },
    },
    required: ["title"],
  },
};

/**
 * Tool definition for updating an existing WordPress post
 */
export const updatePostTool: MCPTool = {
  name: "wp_update_post",
  description:
    "Updates an existing WordPress post with comprehensive validation and change tracking. All parameters except ID are optional - only provided fields will be updated.\n\n" +
    "**Usage Examples:**\n" +
    '• Update title: `wp_update_post --id=123 --title="New Title"`\n' +
    '• Update content: `wp_update_post --id=123 --content="<p>Updated content</p>"`\n' +
    '• Change status: `wp_update_post --id=123 --status="publish"`\n' +
    "• Update categories: `wp_update_post --id=123 --categories=[1,5,10]`\n" +
    "• Set featured image: `wp_update_post --id=123 --featured_media=42`\n" +
    "• Remove featured image: `wp_update_post --id=123 --featured_media=0`\n" +
    '• Multiple updates: `wp_update_post --id=123 --title="New Title" --status="publish" --categories=[1,2]`',
  inputSchema: {
    type: "object",
    properties: {
      id: {
        type: "number",
        description: "The ID of the post to update.",
      },
      title: {
        type: "string",
        description: "The new title for the post.",
      },
      content: {
        type: "string",
        description: "The new content for the post, in HTML format.",
      },
      status: {
        type: "string",
        description: "The new publishing status for the post.",
        enum: ["publish", "draft", "pending", "private"],
      },
      excerpt: {
        type: "string",
        description: "The new excerpt for the post.",
      },
      categories: {
        type: "array",
        items: { type: "number" },
        description: "An array of category IDs to assign to the post.",
      },
      tags: {
        type: "array",
        items: { type: "number" },
        description: "An array of tag IDs to assign to the post.",
      },
      featured_media: {
        type: "number",
        description: "The ID of the featured media (image). Use 0 to remove featured media.",
      },
      date: {
        type: "string",
        description: "The date the post was published, in the site's timezone (ISO 8601 format).",
      },
    },
    required: ["id"],
  },
};

/**
 * Tool definition for deleting a WordPress post
 */
export const deletePostTool: MCPTool = {
  name: "wp_delete_post",
  description:
    "Deletes a WordPress post with options for trash or permanent deletion. Includes safety confirmations and detailed feedback on the deletion action.\n\n" +
    "**Usage Examples:**\n" +
    "• Trash a post: `wp_delete_post --id=123` (moves to trash)\n" +
    "• Permanent deletion: `wp_delete_post --id=123 --force=true`\n" +
    "• Bulk operations: Use multiple calls with different IDs",
  inputSchema: {
    type: "object",
    properties: {
      id: {
        type: "number",
        description: "The ID of the post to delete.",
      },
      force: {
        type: "boolean",
        description: "Whether to bypass trash and force deletion (default: false, moves to trash).",
      },
    },
    required: ["id"],
  },
};

/**
 * Tool definition for retrieving post revisions
 */
export const getPostRevisionsTool: MCPTool = {
  name: "wp_get_post_revisions",
  description:
    "Retrieves the revision history for a specific post, including details about changes, dates, and authors for content management and auditing purposes.",
  inputSchema: {
    type: "object",
    properties: {
      id: {
        type: "number",
        description: "The ID of the post to get revisions for.",
      },
    },
    required: ["id"],
  },
};

/**
 * Collection of all post tool definitions
 */
export const postToolDefinitions = [
  listPostsTool,
  getPostTool,
  createPostTool,
  updatePostTool,
  deletePostTool,
  getPostRevisionsTool,
];
