using System.Text.Json.Serialization;
using Yi.Framework.AiHub.Domain.Shared.Dtos.OpenAi;

namespace Yi.Framework.AiHub.Domain.Shared.Dtos.Anthropic;

public class AnthropicStreamDto
{
    [JsonPropertyName("type")] public string? Type { get; set; }

    [JsonPropertyName("index")] public int? Index { get; set; }

    [JsonPropertyName("content_block")] public AnthropicChatCompletionDtoContentBlock? ContentBlock { get; set; }

    [JsonPropertyName("delta")] public AnthropicChatCompletionDtoDelta? Delta { get; set; }

    [JsonPropertyName("message")] public AnthropicChatCompletionDto? Message { get; set; }

    [JsonPropertyName("usage")] public AnthropicCompletionDtoUsage? Usage { get; set; }

    [JsonPropertyName("error")] public AnthropicStreamErrorDto? Error { get; set; }
    
}

public class AnthropicStreamErrorDto
{
    [JsonPropertyName("type")] public string? Type { get; set; }

    [JsonPropertyName("message")] public string? Message { get; set; }
}

public class AnthropicChatCompletionDtoDelta
{
    [JsonPropertyName("type")] public string? Type { get; set; }

    [JsonPropertyName("text")] public string? Text { get; set; }

    [JsonPropertyName("thinking")] public string? Thinking { get; set; }

    [JsonPropertyName("partial_json")] public string? PartialJson { get; set; }

    [JsonPropertyName("stop_reason")] public string? StopReason { get; set; }
    
    [JsonPropertyName("signature")] public string? Signature { get; set; }
    
    [JsonPropertyName("stop_sequence")] public string? StopSequence { get; set; }
    
}

public class AnthropicChatCompletionDtoContentBlock
{
    [JsonPropertyName("type")] public string? Type { get; set; }

    [JsonPropertyName("thinking")] public string? Thinking { get; set; }

    [JsonPropertyName("signature")] public string? Signature { get; set; }

    [JsonPropertyName("id")] public string? Id { get; set; }

    [JsonPropertyName("name")] public string? Name { get; set; }

    [JsonPropertyName("input")] public object? Input { get; set; }

    [JsonPropertyName("server_name")] public string? ServerName { get; set; }

    [JsonPropertyName("is_error")] public bool? IsError { get; set; }

    [JsonPropertyName("tool_use_id")] public string? ToolUseId { get; set; }

    [JsonPropertyName("content")] public object? Content { get; set; }
    
    [JsonPropertyName("text")] public string? Text { get; set; }
}

public class AnthropicChatCompletionDto
{
    public string id { get; set; }

    public string type { get; set; }

    public string role { get; set; }

    public AnthropicChatCompletionDtoContent[] content { get; set; }

    public string model { get; set; }

    public string stop_reason { get; set; }

    public object stop_sequence { get; set; }

    public AnthropicCompletionDtoUsage? Usage { get; set; }
    
}

public class AnthropicChatCompletionDtoContent
{
    public string type { get; set; }

    public string? text { get; set; }

    public string? id { get; set; }

    public string? name { get; set; }

    public object? input { get; set; }

    [JsonPropertyName("thinking")] public string? Thinking { get; set; }

    [JsonPropertyName("partial_json")] public string? PartialJson { get; set; }

    public string? signature { get; set; }
    
}

public class AnthropicCompletionDtoUsage
{
    [JsonPropertyName("input_tokens")] public int? InputTokens { get; set; }

    [JsonPropertyName("cache_creation_input_tokens")]
    public int? CacheCreationInputTokens { get; set; }

    [JsonPropertyName("cache_read_input_tokens")]
    public int? CacheReadInputTokens { get; set; }

    [JsonPropertyName("output_tokens")] public int? OutputTokens { get; set; }

    [JsonPropertyName("server_tool_use")] public AnthropicServerToolUse? ServerToolUse { get; set; }
    
    [JsonPropertyName("cache_creation")] public object? CacheCreation { get; set; }

    [JsonPropertyName("service_tier")] public string? ServiceTier { get; set; }


}

public class AnthropicServerToolUse
{
    [JsonPropertyName("web_search_requests")]
    public int? WebSearchRequests { get; set; }
}