using log4net.Core;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Swashbuckle.AspNetCore.Annotations;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using UF.AssessmentProject.Helper;
using UF.AssessmentProject.logs;
using UF.AssessmentProject.Providers;

namespace UF.AssessmentProject.Controllers
{
    [Produces("application/json"),
        Route("api/[action]"),
        ApiController]
    [SwaggerTag("Transaction Middleware Controller to keep transactional data in Log Files")]
    public class TransactionController : ControllerBase
    {

        private readonly HomeProvider _homeProvider = new HomeProvider();
        private readonly ILoggerManager _logger;

        public TransactionController(ILoggerManager logger)
        {
            _logger = logger;
        }


        /// <summary>
        /// Submit Transaction data
        /// </summary>
        /// <remarks>
        /// Ensure all parameter needed and responded as per IDD
        /// Ensure all posible validation is done
        /// API purpose: To ensure all data is validated and only valid partner with valid signature are able to access to this API
        /// </remarks>
        /// <param name="req">language:en-US(English), ms-MY(BM)</param>  
        /// <returns></returns>
        /// 
        [HttpPut]
        [SwaggerResponse(StatusCodes.Status200OK, "Submit Transaction Message successfully", typeof(Model.Transaction.ResponseMessage))]
        [SwaggerResponse(StatusCodes.Status401Unauthorized, "Unauthorized, Request")]
        [SwaggerResponse(StatusCodes.Status500InternalServerError, "Oops! Can't get your Post right now")]
        public ActionResult<Model.Transaction.ResponseMessage> SubmitTRansaction(Model.Transaction.RequestMessage req)
        {
            try {
                Model.Transaction.ResponseMessage results = new Model.Transaction.ResponseMessage();
                results.success = 0;
                // Your Code here
                

                results = _homeProvider.Validate(req);

                _logger.LogInformation(Request.Path.ToString() + "\r\nRequest = " + JsonConvert.SerializeObject(req));

                if (results.success == DataDictionary.responseResult.failed)
                {
                    _logger.LogError(Request.Path.ToString() + "\r\nResponse =" + JsonConvert.SerializeObject(results));
                }
                else
                {
                    _logger.LogInformation(Request.Path.ToString() + "\r\nResponse =" + JsonConvert.SerializeObject(results));
                }
                return Ok(results);
            }
            catch (Exception ex)
            {
                return BadRequest(ex.Message);
            }
        }

        /// <summary>
        /// Test this controller is active
        /// </summary>
        /// <remarks>
        /// Test API to check API is Alive or not
        /// </remarks>
        /// <returns></returns>
        [HttpGet]
        public ActionResult<string> TestAPI()
        {
            string result = "Hello World!";
            return Ok(result);
        }
    }
}