using Microsoft.Extensions.Configuration;
using RestSharp;
using SharpCompress.Common;
using System.Diagnostics;

namespace IRaCIS.Core.Application.Helper;

public class FileConvertHelper
{

    /// <summary>
    /// 镜像里面打入libreoffice 的方案
    /// </summary>
    /// <param name="inputWordFilePath"></param>
    /// <param name="outputPdfDir"></param>
    static public void ConvertWordToPdf(string inputWordFilePath, string outputPdfDir)
    {
        // 设置 libreoffice 命令行参数
        string arguments = $"--headless --invisible --convert-to pdf \"{inputWordFilePath}\" --outdir \"{outputPdfDir}\"";

        // 启动 libreoffice 进程
        using (Process process = new Process())
        {
            process.StartInfo.FileName = "libreoffice";
            process.StartInfo.Arguments = arguments;
            process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            process.StartInfo.RedirectStandardOutput = true;
            process.StartInfo.RedirectStandardError = true;
            process.StartInfo.UseShellExecute = false;
            process.StartInfo.CreateNoWindow = true;

            process.Start();

            // 等待进程结束
            process.WaitForExit();
        }
    }


    /// <summary>
    /// 返回文件字节数组
    /// File.WriteAllBytes(outputFilePath, response.RawBytes);  直接将字节数组写入到本地某个路径
    /// var stream = new MemoryStream(response.RawBytes);  直接变为内存流,给其他程序用也可以
    /// </summary>
    /// <returns></returns>
    static public async Task<byte[]> ThirdStirling_PDFWordToPdfAsync(string filePath)
    {

        var apiUrl = GetApiUrl();

        var client = new RestClient(apiUrl);

        var request = new RestRequest(apiUrl, Method.Post);

        request.AddHeader("accept", "*/*");

        // 直接上传文件,无需生成字节数组
        request.AddFile("fileInput", filePath);

        return await GetPDFByteArrayAsync(client, request);
    }

    static public async Task<byte[]> ThirdStirling_PDFWordToPdfAsync(byte[] fileBytes, string fileName)
    {

        var apiUrl = GetApiUrl();
        var client = new RestClient(apiUrl);

        var request = new RestRequest(apiUrl, Method.Post);

        request.AddHeader("accept", "*/*");

        // 添加文件流到请求
        request.AddFile("fileInput", fileBytes, fileName);

        return await GetPDFByteArrayAsync(client, request);
    }

    static private async Task<byte[]> GetPDFByteArrayAsync(RestClient client, RestRequest request)
    {
        try
        {



            // 发送请求并获取响应
            var response = await client.ExecuteAsync(request);

            // 检查请求是否成功
            if (response.IsSuccessful)
            {
                return response.RawBytes ?? new byte[] { };
            }
            else
            {
                Console.WriteLine($"上传失败,错误代码: {response.StatusCode}, 错误消息: {response.ErrorMessage}");

                return Array.Empty<byte>();
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("发生异常: " + ex.Message);

            return Array.Empty<byte>();
        }
    }

    static private string GetApiUrl()
    {

        var enviromentName = Environment.GetEnvironmentVariables()["ASPNETCORE_ENVIRONMENT"]?.ToString();

        var configuration = new ConfigurationBuilder().AddJsonFile($"appsettings.{enviromentName}.json", false, false).Build();

        // 手动绑定配置
        var appSettings = new ServiceVerifyConfigOption();
        configuration.GetSection("BasicSystemConfig").Bind(appSettings);

        return appSettings.ThirdPdfUrl;
    }


}