using Inspectron.Epson.PrintServer.Printers.Utils.KitchenReceipt;

namespace Inspectron.Epson.PrintServer.Printers.Utils.BarReceipt;

public class BarReceiptConverter
{
    private readonly int _lineWidth;
    private readonly int _BigLineWidth;

    public BarReceiptConverter(int lineWidth = 42, int bigLineWidth=22)
    {
        _BigLineWidth = bigLineWidth;
        _lineWidth = lineWidth;
    }

    public List<PrintCommand> ConvertToPrintCommands(BarReceipt kitchenReceipt)
    {
        var commands = new List<PrintCommand>();

        // Header - Restaurant name in red
        commands.Add(new PrintCommand(Center(kitchenReceipt.Title, true)) { IsRed = true, IsBig = true });
        commands.Add(new PrintCommand(CreateDashedLine()));
        commands.Add(new PrintCommand(""));

        // Transaction info
        string dateTimeLine = $"{kitchenReceipt.TransactionDateTime:dd-MMM-yy HH:mm} Nr.:{kitchenReceipt.ReceiptNumber}";
        commands.Add(new PrintCommand(Center(dateTimeLine, false)));

        string serverLine = $"{kitchenReceipt.WaiterName}";
        commands.Add(new PrintCommand(Center(serverLine, false)));

        //string serverIdLine = $"{kitchenReceipt.WaiterId}";
        //commands.Add(new PrintCommand(Center(serverIdLine, false)));
        commands.Add(new PrintCommand(""));
        string tableLine = $"Tisch: {kitchenReceipt.TableNumber}";
        commands.Add(new PrintCommand(Center(tableLine, true), true, true));

        if (!string.IsNullOrEmpty(kitchenReceipt.SpecialInstruction))
        {
            commands.Add(new PrintCommand(""));
            commands.Add(new PrintCommand(Center(kitchenReceipt.SpecialInstruction, true), true, true));
            commands.Add(new PrintCommand(""));
        }

        commands.Add(new PrintCommand(CreateDashedLine()));




        // Gangs

        foreach (Gang gang in kitchenReceipt.Gangs)
        {

            commands.Add(new PrintCommand(Center($"{gang.Id}. {gang.Name}", false)) { IsRed = true });
            foreach (var dish in gang.Dishes)
            {
                PrintDish(dish, commands);
            }
        }

        if (kitchenReceipt.Gangs.Count > 0)
        {
            commands.Add(new PrintCommand(CreateDashedLine()));
        }

        foreach (var dish in kitchenReceipt.Dishes)
        {
            PrintDish(dish, commands);
        }

        if (kitchenReceipt.Dishes != null && kitchenReceipt.Dishes.Any())
        {
            commands.Add(new PrintCommand(""));
            commands.Add(new PrintCommand(CreateDashedLine()));
            commands.Add(new PrintCommand(""));
        }


        //// Additional info section
        //if (kitchenReceipt.AdditionalInfo != null && kitchenReceipt.AdditionalInfo.Count > 0)
        //{
        //    commands.Add(new PrintCommand(CreateAsterisksLine()));
        //    commands.Add(new PrintCommand("Info über zugehörige Artikel"));
        //    commands.Add(new PrintCommand(CreateAsterisksLine()));

        //    foreach (var info in kitchenReceipt.AdditionalInfo)
        //    {
        //        commands.Add(new PrintCommand(info));
        //    }

        //    commands.Add(new PrintCommand(""));
        //}

        return commands;
    }

    private static void PrintDish(Dish drink, List<PrintCommand> commands)
    {
        string drinkLine = $"{drink.Number}x {drink.Name}";
        commands.Add(new PrintCommand(drinkLine,isBig:true));
        // Modifications
        if (drink.Modifications != null && (drink.Modifications.Removed.Any() || drink.Modifications.Added.Any()))
        {
            foreach (var removed in drink.Modifications.Removed)
            {
                commands.Add(new PrintCommand($"  - {removed}", isBold:true));
            }

            foreach (var added in drink.Modifications.Added)
            {
                commands.Add(new PrintCommand($"  + {added}", isBold: true));
            }
        }

        // SpecialInstruction
        if (!string.IsNullOrEmpty(drink.Comment))
        {
            commands.Add(new PrintCommand($"  Comment: {drink.Comment}", isBold: true));
        }

        commands.Add(new PrintCommand("")); // Extra line between drinks for bar
    }

    private string Center(string text, bool isBigFont)
    {
        var actualLineWidth = isBigFont ? _BigLineWidth : _lineWidth;
        if (string.IsNullOrEmpty(text) || text.Length >= actualLineWidth)
            return text;

        int totalPadding = actualLineWidth - text.Length;
        int leftPadding = totalPadding / 2;

        return new string(' ', leftPadding) + text;
    }

    private string CreateDashedLine()
    {
        return new string('-', _lineWidth);
    }

    private string CreateAsterisksLine()
    {
        return new string('*', _lineWidth);
    }
}
