using System.Net.Http;
using System.Net.Http.Headers;
using System.Text.Json;
using System.Text.Json.Serialization;
using JsonSerializer = System.Text.Json.JsonSerializer;
using System.IO;
namespace OASystem.API.OAMethodLib.DeepSeekAPI
{
    /// 
    /// DeepSeek API 服务实现
    /// 
    public class DeepSeekService : IDeepSeekService
    {
        private readonly HttpClient _httpClient;
        private readonly ILogger _logger;
        private readonly IHostEnvironment _hostEnvironment;
        /// 
        /// 配置文件
        /// 
        private DeepSeek DeepSeek { get; set; }
        /// 
        /// 构造函数
        /// 
        public DeepSeekService(IHostEnvironment hostEnvironment, ILogger logger, HttpClient httpClient)
        {
            _hostEnvironment = hostEnvironment;
            _httpClient = httpClient;
            _logger = logger;
            DeepSeek = AutofacIocManager.Instance.GetService();
            // 设置基础地址和认证头
            _httpClient.BaseAddress = new Uri(DeepSeek.BaseAddress ?? "https://api.deepseek.com/v1/");
            _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", DeepSeek.ApiKey);
            _httpClient.DefaultRequestHeaders.Add("Accept", "application/json");
        }
        /// 
        /// 测试API连通性
        /// 
        /// 
        public async Task TestApiConnectivityAsync()
        {
            try
            {
                var response = await _httpClient.GetAsync("models");
                return response.IsSuccessStatusCode;
            }
            catch
            {
                return false;
            }
        }
        /// 
        /// 检查可用端点
        /// 
        /// 
        public async Task> DiscoverAvailableEndpointsAsync()
        {
            var endpoints = new List
        {
            "models",
            "chat/completions",
            "files",
            "uploads",
            "documents",
            "assistants"
        };
            var availableEndpoints = new List();
            foreach (var endpoint in endpoints)
            {
                try
                {
                    var response = await _httpClient.GetAsync(endpoint);
                    if (response.IsSuccessStatusCode)
                    {
                        availableEndpoints.Add(endpoint);
                        Console.WriteLine($"✅ 端点可用: {endpoint}");
                    }
                    else
                    {
                        Console.WriteLine($"❌ 端点不可用: {endpoint} - {response.StatusCode}");
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"⚠️ 端点检查错误: {endpoint} - {ex.Message}");
                }
            }
            return availableEndpoints;
        }
        /// 
        /// 上传文件到DeepSeek API
        /// 
        public async Task UploadFileAsync(IFormFile file, string purpose = "assistants")
        {
            try
            {
                _logger.LogInformation("开始上传文件: {FileName}, 大小: {Size} bytes", file.FileName, file.Length);
                // 检查文件大小
                if (file.Length > 512 * 1024 * 1024) // 512MB限制
                {
                    throw new Exception($"文件大小超过限制: {file.Length} bytes");
                }
                using var content = new MultipartFormDataContent();
                using var fileStream = file.OpenReadStream();
                var fileContent = new StreamContent(fileStream);
                fileContent.Headers.ContentType = new MediaTypeHeaderValue(GetContentType(file.FileName));
                content.Add(fileContent, "file", file.FileName);
                content.Add(new StringContent(purpose), "purpose");
                var response = await _httpClient.PostAsync("files", content);
                _logger.LogInformation("文件上传路径:{filePath}", response.RequestMessage.RequestUri);
                response.EnsureSuccessStatusCode();
                var responseContent = await response.Content.ReadAsStringAsync();
                var result = JsonSerializer.Deserialize(responseContent, new JsonSerializerOptions
                {
                    PropertyNameCaseInsensitive = true
                });
                _logger.LogInformation("文件上传成功: {FileName}, FileId: {FileId}", file.FileName, result.Id);
                return result;
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "文件上传失败: {FileName}", file.FileName);
                throw;
            }
        }
        /// 
        /// 批量上传文件
        /// 
        public async Task> UploadFilesAsync(List files, string purpose = "assistants")
        {
            var results = new List();
            foreach (var file in files)
            {
                var result = new FileUploadResult
                {
                    FileName = file.FileName,
                    FileSize = file.Length
                };
                try
                {
                    var uploadResponse = await UploadFileAsync(file, purpose);
                    result.FileId = uploadResponse.Id;
                    result.Success = true;
                    result.Status = uploadResponse.Status;
                    result.Message = "上传成功";
                }
                catch (Exception ex)
                {
                    result.Success = false;
                    result.Message = $"上传失败: {ex.Message}";
                    result.Status = "error";
                }
                results.Add(result);
            }
            return results;
        }
        /// 
        /// 获取文件列表
        /// 
        public async Task ListFilesAsync()
        {
            try
            {
                var response = await _httpClient.GetAsync("files");
                response.EnsureSuccessStatusCode();
                var responseContent = await response.Content.ReadAsStringAsync();
                return JsonSerializer.Deserialize(responseContent, new JsonSerializerOptions
                {
                    PropertyNameCaseInsensitive = true
                });
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "获取文件列表失败");
                throw;
            }
        }
        /// 
        /// 获取文件信息
        /// 
        public async Task GetFileInfoAsync(string fileId)
        {
            try
            {
                var response = await _httpClient.GetAsync($"files/{fileId}");
                response.EnsureSuccessStatusCode();
                var responseContent = await response.Content.ReadAsStringAsync();
                return JsonSerializer.Deserialize(responseContent, new JsonSerializerOptions
                {
                    PropertyNameCaseInsensitive = true
                });
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "获取文件信息失败: {FileId}", fileId);
                throw;
            }
        }
        /// 
        /// 删除文件
        /// 
        public async Task DeleteFileAsync(string fileId)
        {
            try
            {
                var response = await _httpClient.DeleteAsync($"files/{fileId}");
                response.EnsureSuccessStatusCode();
                _logger.LogInformation("文件删除成功: {FileId}", fileId);
                return true;
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "文件删除失败: {FileId}", fileId);
                return false;
            }
        }
        /// 
        /// 使用已上传的文件进行聊天
        /// 
        public async Task ChatWithFilesAsync(List fileIds, string question, string model = "deepseek-chat", float temperature = 0.7f, int maxTokens = 4000)
        {
            try
            {
                // 等待所有文件处理完成
                var processedFiles = new List();
                foreach (var fileId in fileIds)
                {
                    var fileInfo = await WaitForFileProcessingAsync(fileId);
                    processedFiles.Add(fileInfo);
                }
                // 构建消息内容
                var messageContent = new List