using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UF.AssessmentProject.Helper;

namespace UF.AssessmentProject.Providers
{
    public class HomeProvider : baseProvider
    {
     
        public Model.Transaction.ResponseMessage validateField(Model.Transaction.RequestMessage req)
        {
            var resultmess = "";
            if (req.partnerkey == null) { 
                resultmess += "partnerkey is required!, ";
            }
            else if (req.partnerrefno == null) { 
                resultmess += "partnerrefno is required!, ";
            }
            else if(req.timestamp == null) { 
                resultmess += "timestamp is required!, ";
            }
            else if(req.sig == null) { 
                resultmess += "sig is required!, ";
            }
            
            if(resultmess.Length > 0) 
            { 
                return new Model.Transaction.ResponseMessage
                {
                    success = DataDictionary.responseResult.failed,
                    resultmessage = resultmess.Substring(0,resultmess.Length-2),
                };
            }

            return new Model.Transaction.ResponseMessage
            {
                success = DataDictionary.responseResult.success,
            };
        }


        public Model.Transaction.ResponseMessage Validate(Model.Transaction.RequestMessage req)
        {

            var rs = validateField(req);
            if (rs.success == DataDictionary.responseResult.failed)
            {
                return rs;
            }

            if (DateTime.Now >= DateTime.Parse(req.timestamp).AddMinutes(5))
            {
                return new Model.Transaction.ResponseMessage
                {
                    success = DataDictionary.responseResult.failed,
                    resultmessage = "Expired!"
                };
            }

            var rawsig = DateTime.Parse(req.timestamp).ToString("yyyyMMddHHmmss") + req.partnerkey + req.partnerrefno + req.totalamount + req.partnerpassword;
            string sig = CommonUtils.ComputeSha256Hash((CommonUtils.EncodeBase64(rawsig)));
            var partner = db.Partners.Where(c => c.partnerkey == req.partnerkey).FirstOrDefault();

            if (partner == null || (partner != null && (CommonUtils.EncodeBase64(partner.partnerpassword) != req.partnerpassword)) || sig != req.sig) 
            { 
                return new Model.Transaction.ResponseMessage
                {
                    success = DataDictionary.responseResult.failed,
                    resultmessage = "Access Denied!",
                };
            }

            var checkNameNull = req.items.Where(x => string.IsNullOrEmpty(x.name) == true).ToList().Count();
            if (checkNameNull > 0)
            {
                return new Model.Transaction.ResponseMessage
                {
                    success = DataDictionary.responseResult.failed,
                    resultmessage = "item name cannot be null!",
                };
            }

            var checkPartneritemrefNull = req.items.Where(x => string.IsNullOrEmpty(x.partneritemref) == true).ToList().Count();
            if (checkNameNull > 0)
            {
                return new Model.Transaction.ResponseMessage
                {
                    success = DataDictionary.responseResult.failed,
                    resultmessage = "partneritemref name cannot be null!",
                };
            }

            var checkUnitPrice = req.items.Where(x => x.unitprice < 0 ).ToList().Count();
            if (checkUnitPrice > 0)
            {
                return new Model.Transaction.ResponseMessage
                {
                    success = DataDictionary.responseResult.failed,
                    resultmessage = "unitprice only allow positive value!",
                };
            }

            long total = 0;
            foreach (Model.Transaction.itemdetail item in req.items)
            {
                if (item.qty > 0 && item.qty <= 5)
                { 
                    total += item.qty * item.unitprice; 
                }
                else 
                { 
                    return new Model.Transaction.ResponseMessage
                    {
                        success = DataDictionary.responseResult.failed,
                        resultmessage = "qty only allow positive and not exceed 5",
                    };
                }
            }

            if ( req.totalamount != total)
            {
                return new Model.Transaction.ResponseMessage
                {
                    success = DataDictionary.responseResult.failed,
                    resultmessage = "Invalid Total Amount.",
                };
            }

            return new Model.Transaction.ResponseMessage
            {
                success = DataDictionary.responseResult.success,
                resultmessage = "Request data is valid.",
            };
        }

    }
}