// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the MIT License.

import { McpResourceTriggerOptions } from '../../types';

/**
 * Validates and returns an McpResourceTriggerOptions object.
 *
 * @param options - The input options to validate.
 * @returns The validated McpResourceTriggerOptions object.
 * @throws Error if required properties are missing or invalid.
 */
export function convertToMcpResourceTriggerOptionsToRpc(options: McpResourceTriggerOptions): McpResourceTriggerOptions {
    // Validate required properties
    if (!options.uri || typeof options.uri !== 'string' || options.uri.trim() === '') {
        throw new Error('MCP Resource trigger requires a valid "uri" property.');
    }

    if (!options.resourceName || typeof options.resourceName !== 'string' || options.resourceName.trim() === '') {
        throw new Error('MCP Resource trigger requires a valid "resourceName" property.');
    }

    // Build the result object with required properties
    const result: McpResourceTriggerOptions = {
        uri: options.uri,
        resourceName: options.resourceName,
    };

    // Add optional properties if they are defined
    if (options.title !== undefined) {
        result.title = options.title;
    }

    if (options.description !== undefined) {
        result.description = options.description;
    }

    if (options.mimeType !== undefined) {
        result.mimeType = options.mimeType;
    }

    if (options.size !== undefined) {
        if (typeof options.size !== 'number' || options.size < 0) {
            throw new Error('MCP Resource trigger "size" must be a non-negative number.');
        }
        result.size = options.size;
    }

    if (options.metadata !== undefined && typeof options.metadata === 'string' && options.metadata.trim() !== '') {
        // Validate that metadata is a valid JSON string
        try {
            JSON.parse(options.metadata);
        } catch (e) {
            throw new Error('MCP Resource trigger "metadata" must be a valid JSON string.');
        }
        result.metadata = options.metadata;
    }

    return result;
}
