﻿using System;
using System.Net;
using Amazon;
using Amazon.Runtime;
using Amazon.Translate;
using Amazon.Translate.Model;
using UnityEngine;

namespace BansheeGz.BGDatabase.Editor
{
    [BGPlugin(Version = "1.0")]
    public class BGTranslationServiceAmazonDelegate : BGTranslationServiceAmazon.BGTranslationServiceAmazonI
    {
        private BasicAWSCredentials credentials;
        private AmazonTranslateClient client;

        private AmazonTranslateClient Client
        {
            get
            {
                var clientOk = client != null && credentials != null;
                if (clientOk)
                {
                    var creds = credentials.GetCredentials();
                    var settings = BGSettingsLocalization.Model;
                    if (!string.Equals(creds.AccessKey, settings.AmazonKey) || !string.Equals(creds.SecretKey, settings.AmazonSecret)) clientOk = false;
                }

                if (!clientOk)
                {
                    if (client != null) client.Dispose();

                    var settings = BGSettingsLocalization.Model;
                    credentials = new BasicAWSCredentials(settings.AmazonKey, settings.AmazonSecret);
                    client = new AmazonTranslateClient(credentials, new AmazonTranslateConfig
                    {
                        RegionEndpoint = RegionEndpoint.USWest2,
                        Timeout = new TimeSpan(0, 0, 5),
                        ReadWriteTimeout = new TimeSpan(0, 0, 5),
                        LogResponse = true,
                    });
                }

                return client;
            }
        }
        
        public void Translate(BGTranslationServiceA.TranslateRequest request, Action onComplete)
        {
            Call(translateClient =>
            {
                request.ForEachText((id, text) =>
                {
                    var requestSourceLanguage = request.SourceLanguage;
                    var targetLanguageCode = request.GetDestination(id);
                    if (!Valid(requestSourceLanguage, targetLanguageCode))
                    {
                        request.AddError(id, 0, requestSourceLanguage + "->" + targetLanguageCode + " is invalid language pair to use for translation");
                    }
                    else
                    {
                        try
                        {
                            //there is no any error actually- the call just fail without any message
                            var response = translateClient.TranslateText(new TranslateTextRequest
                            {
                                SourceLanguageCode = requestSourceLanguage,
                                TargetLanguageCode = targetLanguageCode,
                                Text = text,
                            });

                            if (response.HttpStatusCode == HttpStatusCode.OK) request.AddResult(id, response.TranslatedText);
                            else request.AddError(id, (int) response.HttpStatusCode, "error");
                        }
                        catch (Exception e)
                        {
                            Debug.LogException(e);
                            request.AddError(id, 0, "error:" + e.Message);  
                        }
                    }
                });
            });
            onComplete();
        }
        private void Call(Action<AmazonTranslateClient> action)
        {
            var oldCallback = System.Net.ServicePointManager.ServerCertificateValidationCallback;
            System.Net.ServicePointManager.ServerCertificateValidationCallback = (a, b, c, d) => true;
            try
            {
                action(Client);
            }
            finally
            {
                System.Net.ServicePointManager.ServerCertificateValidationCallback = oldCallback;
            }
        }
        
        private bool Valid(string source, string target)
        {
            if (string.Equals(source, target)) return false;
            // if (!source.Equals("en") && !target.Equals("en")) return false;
            return true;
        }


    }
    
}
