using System;
using System.Collections.Generic;
using System.Text;

namespace Dfs.WayneChina.HyperPrinterHandler
{
    internal class Parser
    {
        private int prefixLen = 0;
        private int remainingLen = 0;
        private int maximumLen = 32;

        NLog.Logger logger = NLog.LogManager.LoadConfiguration("NLog.config").GetLogger("HyperPrinter");

        /// <summary>
        /// 
        /// </summary>
        /// <param name="raw"></param>
        /// <returns></returns>
        public List<ReceiptLineItem> ParseToReceiptLineItems(string raw)
        {
            string[] rawReceiptLines = raw.Split(new string[] { "<tr>" }, StringSplitOptions.RemoveEmptyEntries);
            List<ReceiptLineItem> receiptLineItems = new List<ReceiptLineItem>();
            foreach (var rawReceiptLine in rawReceiptLines)
            {
                if (string.IsNullOrEmpty(rawReceiptLine) || !rawReceiptLine.Contains("<td"))
                    continue;
                else
                {
                    logger.Info($"rawReceiptLine: {rawReceiptLine}");
                    var tempReceiptLine = rawReceiptLine.Replace("\\r\\n", "").Replace("\\t", "").Replace("\\", "");
                    logger.Info($"tempReceiptLine: {tempReceiptLine}");
                    var tempReceiptLineNew = tempReceiptLine.Replace("< tr >", "");
                    logger.Info($"tempReceiptLineNew: {tempReceiptLineNew}");

                    var receiptLineItem = new ReceiptLineItem(prefixLen, remainingLen, maximumLen);
                    string[] rawReceiptColumnItems = tempReceiptLineNew.Trim().Split(new string[] { "<td" }, StringSplitOptions.RemoveEmptyEntries);
                    if (rawReceiptColumnItems.Length > 0)
                    {
                        foreach (var ci in rawReceiptColumnItems)
                        {
                            try
                            {
                                logger.Info(ci);

                                var receiptColumnItem = new ReceiptColumnItem();
                                receiptColumnItem.align = ci.Contains("align=") ? (ci.Contains("left") ? "left" : (ci.Contains("right") ? "right" : "center"))
                                    : "left";
                                receiptColumnItem.Text = ci.Substring(ci.IndexOf(">") + 1, ci.IndexOf("<") - ci.IndexOf(">") - 1).Trim();
                                var temp = ci.Contains("colspan") ? ci.Substring(ci.IndexOf("colspan"), ci.Length - ci.IndexOf("colspan")) : string.Empty;
                                if (!string.IsNullOrEmpty(temp))
                                {
                                    temp = temp.Replace("colspan=\"", "");
                                    receiptColumnItem.colspan = Convert.ToInt32(temp.Substring(0, temp.IndexOf("\"")));
                                }
                                temp = ci.Contains("width") ? ci.Substring(ci.IndexOf("width"), ci.Length - ci.IndexOf("width")) : string.Empty;
                                if (!string.IsNullOrEmpty(temp))
                                {
                                    temp = temp.Replace("width=\"", "");
                                    receiptColumnItem.width = Convert.ToInt32(temp.Substring(0, temp.IndexOf("%")));
                                }
                                receiptLineItem.ColumnItems.Add(receiptColumnItem);
                            }
                            catch (Exception ex)
                            {

                                logger.Info($"Exception: {ex}");
                            }

                        }
                    }
                    receiptLineItems.Add(receiptLineItem);
                }
            }

            return receiptLineItems;
        }
    }
}