using System.Text.Json.Serialization;

namespace ColaFlow.Modules.Mcp.Contracts.JsonRpc;

/// <summary>
/// JSON-RPC 2.0 response object
/// </summary>
public class JsonRpcResponse
{
    /// <summary>
    /// A String specifying the version of the JSON-RPC protocol. MUST be exactly "2.0"
    /// </summary>
    [JsonPropertyName("jsonrpc")]
    public string JsonRpc { get; set; } = "2.0";

    /// <summary>
    /// This member is REQUIRED on success. Must not exist if there was an error
    /// </summary>
    [JsonPropertyName("result")]
    [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
    public object? Result { get; set; }

    /// <summary>
    /// This member is REQUIRED on error. Must not exist if there was no error
    /// </summary>
    [JsonPropertyName("error")]
    [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
    public JsonRpcError? Error { get; set; }

    /// <summary>
    /// This member is REQUIRED. It MUST be the same as the value of the id member in the Request Object.
    /// If there was an error in detecting the id in the Request object (e.g. Parse error/Invalid Request), it MUST be Null.
    /// </summary>
    [JsonPropertyName("id")]
    public object? Id { get; set; }

    /// <summary>
    /// Creates a success response
    /// </summary>
    public static JsonRpcResponse Success(object? result, object? id)
    {
        return new JsonRpcResponse
        {
            Result = result,
            Id = id
        };
    }

    /// <summary>
    /// Creates an error response
    /// </summary>
    public static JsonRpcResponse CreateError(JsonRpcError error, object? id)
    {
        return new JsonRpcResponse
        {
            Error = error,
            Id = id
        };
    }

    /// <summary>
    /// Creates a ParseError response (id is null because request couldn't be parsed)
    /// </summary>
    public static JsonRpcResponse ParseError(string? details = null)
    {
        return CreateError(JsonRpcError.ParseError(details), null);
    }

    /// <summary>
    /// Creates an InvalidRequest response
    /// </summary>
    public static JsonRpcResponse InvalidRequest(string? details = null, object? id = null)
    {
        return CreateError(JsonRpcError.InvalidRequest(details), id);
    }

    /// <summary>
    /// Creates a MethodNotFound response
    /// </summary>
    public static JsonRpcResponse MethodNotFound(string method, object? id)
    {
        return CreateError(JsonRpcError.MethodNotFound(method), id);
    }

    /// <summary>
    /// Creates an InvalidParams response
    /// </summary>
    public static JsonRpcResponse InvalidParams(string? details, object? id)
    {
        return CreateError(JsonRpcError.InvalidParams(details), id);
    }

    /// <summary>
    /// Creates an InternalError response
    /// </summary>
    public static JsonRpcResponse InternalError(string? details, object? id)
    {
        return CreateError(JsonRpcError.InternalError(details), id);
    }
}
