using Grpc.Core;
using AIAss;
using AIAss.Protos;
using System.Net.Http.Headers;
using System.Text.Json;
using System.Text;
using Microsoft.Extensions.Configuration;

namespace AIAss.Services;

public class aiAssistanceService : aiAssistance.aiAssistanceBase
{
    private readonly string Apitoken;
    private readonly string url;
    public aiAssistanceService(IConfiguration configuration)
    {
        url = configuration["aiSettings:url"];
        Apitoken = configuration["aiSettings:apitoken"];

    }

    public async override Task<aiaReply> SendQuestion(aiaRequest request, ServerCallContext context)
    {
        using var client = new HttpClient();
        client.DefaultRequestHeaders.Authorization =
            new AuthenticationHeaderValue("Bearer", Apitoken);
        var content = new
        {
            model = request.Model,
            messages = new[]
                   {
                    new { role = "system", content = "شما یک دستیار پاسخگو به سوالات هستید." },
                    new { role = "user", content = $"با توجه به این متن:{request.Prompts}به این سوال پاسخ بده:{ request.Question}" },
                    new { role = "system", content = "به سوالات غیره متن بالا پاسخ نده و بگو در این زمینه اطلاعی ندارم" }
                }
        };
        var response = await client.PostAsync(url,
                   new StringContent(JsonSerializer.Serialize(content), Encoding.UTF8, "application/json"));
        string reponse = "";
        if (response.IsSuccessStatusCode)
        {
            var json = await response.Content.ReadAsStringAsync();
            using var doc = JsonDocument.Parse(json);
            reponse = doc.RootElement.GetProperty("choices")[0].GetProperty("message").GetProperty("content").GetString();
        }
        else
        {
            reponse = "خطا در ارتباط سرور ai";
        }

        return new aiaReply
        {
            Message = $" {reponse}"
        };
    }
    public async override Task<aiaReply> imageAnalize(aiaRequest request, ServerCallContext context)
    {
            

        using var client = new HttpClient();
        client.DefaultRequestHeaders.Authorization =
            new AuthenticationHeaderValue("Bearer", Apitoken);
        var content = new
        {
            model = request.Model,
            messages = new object[]
    {
        new {
            role = "system",
            content = "شما دستیار برای توصیف آزمایشات هستید."
        },
        new {
            role = "user",
            content = new object[]
            {
                new { type = "text", text = "این تصویر اگر آزمایش انسان است توصیف کن در غیر اینصورت پاسخ نده" },
                new {
                    type = "image_url",
                    image_url = new {
                        url = $"data:image/jpeg;base64,{request.Question}"
                    }
                }
            }
        }
    }
        };

        var response = await client.PostAsync(url,
                   new StringContent(JsonSerializer.Serialize(content), Encoding.UTF8, "application/json"));
        string reponse = "";
        if (response.IsSuccessStatusCode)
        {
            var json = await response.Content.ReadAsStringAsync();
            using var doc = JsonDocument.Parse(json);
            reponse = doc.RootElement.GetProperty("choices")[0].GetProperty("message").GetProperty("content").GetString();
            context.Status = new Status(StatusCode.OK,"is Success");
        }
        else
        {
            reponse = "خطا در ارتباط سرور ai";
            if (response.StatusCode==System.Net.HttpStatusCode.TooManyRequests)
            {
                throw new RpcException(new Status(StatusCode.Cancelled, "ترافیک بالای شبکه در زمان دیگری تلاش کنید"));

            }
            else
                throw new RpcException(new Status(StatusCode.Cancelled, "خطا در ارتباط سرور"));
        }

        return new aiaReply
        {
            Message = $" {reponse}"
        };
    }
}

