using Edge.Core.Parser.BinaryParser.Util;
using System;
using System.Collections.Generic;

namespace WayneChina_IcCardReader_SinoChem.MessageEntity.Outgoing
{
    public enum ICOnlinePayResult
    {
        Success = 0x00,
        Failure
    }

    public class CardOnlinePaymentResultRequest : IcCardReaderMessageBase
    {
        public CardOnlinePaymentResultRequest(ICOnlinePayResult result, double amount, int displayTimeout, string errorInfo)
        {
            RawData = new List<byte>();
            RawData.Add(0x09);

            if (result == ICOnlinePayResult.Success)
            {
                RawData.Add(0x00);
                RawData.AddRange(Convert.ToInt32(amount * 100).GetBCDBytes(3));
                RawData.AddRange(displayTimeout.GetBCDBytes(1));
            }
            else
            {
                RawData.Add(0x01);
                var errorInfoBytes = System.Text.Encoding.GetEncoding("GBK").GetBytes(errorInfo.PadRight(16, ' '));
                if (errorInfoBytes.Length >= 16)
                {
                    for (int i = 0; i < 16; i++)
                        RawData.Add(errorInfoBytes[i]);
                }
            }
        }
    }

    /// <summary>
    /// Represents an online payment result.
    /// This request is used for TCP communication against Terminal.
    /// </summary>
    public class TcpCardOnlinePaymentResultRequest : IcCardReaderMessageBase
    {
        public TcpCardOnlinePaymentResultRequest(ICOnlinePayResult result, double amount, int displayTimeout, string errorInfo)
        {
            RawData = new List<byte>();
            RawData.Add(0x09);

            if (result == ICOnlinePayResult.Success)
            {
                RawData.Add(0x00);

                //For Tokheim
                for (int i = 0; i < 12; i++)
                {
                    RawData.Add(0x00);
                }
                RawData.AddRange(Convert.ToInt32(amount * 100).GetBCDBytes(3));
                RawData.AddRange(displayTimeout.GetBCDBytes(1));
            }
            else
            {
                RawData.Add(0x01);
                var errorInfoBytes = System.Text.Encoding.GetEncoding("GBK").GetBytes(errorInfo.PadRight(16, ' '));
                if (errorInfoBytes.Length >= 16)
                {
                    for (int i = 0; i < 16; i++)
                        RawData.Add(errorInfoBytes[i]);
                }
            }
        }
    }
}