using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using MySqlX.XDevAPI;
using OASystem.API.OAMethodLib.ChatGPT;
using OASystem.API.OAMethodLib.GoogleMapAPI;
using OASystem.API.OAMethodLib.JuHeAPI;
using OASystem.API.OAMethodLib.YouDaoAPI;
using OASystem.Domain.Dtos.Groups;
using OASystem.Domain.Dtos.SmallFun;
using OASystem.Domain.ViewModels.JuHeExchangeRate;
using OASystem.Domain.ViewModels.SmallFun;
using SqlSugar;
using System.Buffers;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Collections.Specialized;
using System.Diagnostics;
using System.Text.Json;
using System.Text.Json.Nodes;
using System.Transactions;
using System.Xml.Linq;

namespace OASystem.API.Controllers
{
    /// <summary>
    /// 小功能接口
    /// </summary>
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class SmallFunController : ControllerBase
    {
        private readonly IJuHeApiService _juHeApiService;
        private readonly IConfiguration _config;

        /// <summary>
        /// 
        /// </summary>
        /// <param name="juHeApiService"></param>
        /// <param name="config"></param>
        public SmallFunController(IJuHeApiService juHeApiService, IConfiguration config)
        {
            this._juHeApiService = juHeApiService;
            this._config = config;
        }

        #region 聚合API 汇率相关
        /// <summary>
        /// 获取汇率币种
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> GetCurrencys()
        {
            var rateCurrencyData = AppSettingsHelper.Get<RateCurrencyModel>("RateCurrency");

            return Ok(JsonView(rateCurrencyData));
        }


        /// <summary>
        /// 获取汇率费用
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> GetCurrencyExchange(ExchangeRateDto rateDto)
        {
            #region 参数处理
            if (string.IsNullOrEmpty(rateDto.CurrencyCodePer) || string.IsNullOrEmpty(rateDto.CurrencyCodeSuf))
            {
                return Ok(JsonView(false, "币种参数为空!"));
            }

            if (rateDto.Money <= 0)
            {
                return Ok(JsonView(false, "转换金额 <= 0!"));
            }
            #endregion

            var result = await _juHeApiService.GetExchangeRateAsync(rateDto);
            if (result.Code != 0 || result == null)
            {
                return Ok(JsonView(false, result.Msg));
            }
            return Ok(JsonView(result.Data));
        }
        #endregion

        #region 有道API 文本翻译

        /// <summary>
        /// 有道翻译 所有语种
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> GetLuaguages()
        {
            var luaguages = new GetYouDaoLanguages().Luanguages;
            return Ok(JsonView(luaguages));
        }

        /// <summary>
        /// 有道翻译
        /// </summary>
        /// <param name="dto">待翻译的文本 目前只支持 中转英</param>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> GetTranslate(YouDaoDto dto)
        {
            if (string.IsNullOrEmpty(dto.Txt))
            {
                return Ok(JsonView("待翻译的文本不能为空!"));
            }
            string from = "zh-CHS", to = "en";
            if (!string.IsNullOrEmpty(dto.From) && !string.IsNullOrEmpty(dto.To))
            {
                var luaguuages = new GetYouDaoLanguages().Luanguages;
                
                var fromLuaguage = luaguuages.Where(a => a.Code == dto.From).FirstOrDefault();
                var toLuaguage = luaguuages.Where(a => a.Code == dto.To).FirstOrDefault();
                if (fromLuaguage == null)
                {
                    return Ok(JsonView("源语言code不支持!"));
                }
                if (toLuaguage == null)
                {
                    return Ok(JsonView("目标语言code不支持!"));
                }

                from = dto.From;
                to = dto.To;
            }


            var translateData = await YouDaoApiTools.GetReTrans(dto.Txt, from, to);

            if (translateData == null || translateData.Code != 0) 
            {
                return Ok(JsonView(false, translateData.Msg));
            }

            return Ok(JsonView( new { translation = translateData.Data }));
        }

        #endregion

        #region googleMapApi 

        /// <summary>
        /// googleMapApi 获取距离And时间
        /// </summary>
        /// <param name="dto">
        /// 请求参数默认值
        /// origin:"FERİT RECAİ ERTUĞRUL CAD. NO: 18 ORAN / ANKARA,Turkey"; 
        /// destination : "Dudullu Mh. Imes Sanayi Sitesi 504. Sk. No:4/B1 Umraniye/Istanbul";
        /// </param>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> GetGooglMapForeignAndTime(GoogleMapDirectionsDto dto)
        {
            var data = await GoogleMapTools.GetForeignAndTime(dto.origin,dto.destination);

            if (data == null || data.Code != 0)
            {
                return Ok(JsonView(false, data.Msg));
            }

            return Ok(JsonView(data.Data));
        }

        #endregion

        #region ChatGPT

        /// <summary>
        /// ChatGPT 自动补全
        /// </summary>
        /// <param name="dto"> </param>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> ChatGptCompletions(CompletionsDto dto)
        {
            if (string.IsNullOrEmpty(dto.Prompt)) 
            {
                return Ok(JsonView(false,"待自动补全的文本为空!"));
            }

            //Stopwatch sw = new Stopwatch();
            //sw.Start();
            //Thread.Sleep(999);
            //Console.WriteLine($"程序耗时：{sw.ElapsedMilliseconds}ms.");

           // var data = await ChatGPTTools.Completions(dto.Prompt);

            //sw.Stop();
            //if (data == null || data.Code != 0)
            //{
                 // return Ok(JsonView(false, data.Msg+"【耗时:"+ sw.ElapsedMilliseconds/1000+ "ms】"));
                 //return Ok(JsonView(false, data.Msg ));
            //}
            string msg = @"前言
人工智能领域的发展历程已经为我们带来了很多尖端技术，例如深度学习、自然语言处理等等。其中，GPT（Generative Pre-training Transformer）是一种基于Transformer架构的预训练语言模型，已经在语音识别、机器翻译、语言生成等领域得到广泛应用。本文将从GPT的基本原理、GPT的优缺点、GPT的应用等多个方面来展开探讨。
GPT的基本原理
GPT是语言模型的一种形式，它是由OpenAI实验室在2018年提出的。它是基于Transformer架构的预训练语言模型，并且通过处理大量的非标记语料来进行训练。GPT采用了单向的、基于自回归的方式来预测生成下一个单词的概率，也就是说，当输入前面的句子时，GPT可以预测下一个最有可能出现的单词是什么。
GPT模型的主要组成部分是一个由多个层级堆叠而成的Transformer编码器，与其他基于Transformer的模型一样，它将输入序列转换为隐藏表示，再将其用于下游任务。每个GPT模型都有多个不同的版本，这些版本使用不同数量的层、不同数量的参数来进行训练。
GPT的优缺点
1、优点
首先， GPT模型可以利用大量的非标记语料来进行预训练，这种预训练可以使得模型更好地理解自然语言，并且提高模型在语言生成等任务中的性能。
其次，GPT模型使用了基于自回归的方式来进行预测，这使得模型在生成文本时具有一定的连贯性和可读性，从而提高了生成文本的质量。
最后，GPT模型采用了Transformer架构来进行编码，这种编码方式不仅可以很好地处理长文本，而且还可以自适应地调节文本中不同单词之间的重要性，从而提高了模型的性能。
2、缺点
虽然GPT模型有很多优点，但是它也存在一些缺点。最明显的一个问题是GPT模型依赖于大量的训练数据，这使得它无法处理那些对数据需求比较大的应用场景。此外，由于GPT是一个生成式模型，因此在生成文本时，它也可能会出现重复、无意义的情况，这也是需要改进的地方。
GPT的应用
GPT的应用领域是很广泛的，下面我们将从自然语言处理、机器翻译、问答系统、语音识别等方面来进行介绍。
1、自然语言处理
GPT的应用最为广泛的领域之一就是自然语言处理。例如，它可以用于语言模型、文本分类、情感分析等等。其中，语言模型是GPT最基本的应用之一，它可以对一段文本中的下一个单词进行预测。
2、机器翻译
机器翻译是另一个GPT的应用领域，它可以将一种语言的文本转换为另一种语言的文本。使用GPT进行机器翻译的一个好处是可以在源语言和目标语言之间进行平滑的转换，从而提高翻译的质量。
3、问答系统
GPT可以用于构建问答系统，其基本原理是通过学习训练数据中的问题和答案，将问题转换为特定领域的答案。当输入一个问题时，GPT可以预测出最有可能的答案，从而提高问答系统的质量。
4、语音识别
GPT也可以用于语音识别，其原理与文本生成类似。使用GPT进行语音识别的一个好处是可以进行语音到文本的转化，从而将语音转化为可观看的文本内容。";
            return Ok(JsonView(200,  " ", msg));
        }


        #endregion
    }
}
