using System;
using System.Collections.Generic;
using System.Diagnostics;

namespace POS
{
    class Program
    {
        private const int amount = 100000; // 1000 рублей - сумма в копейках
        private const int amountAfterSpasibo = 90000; // 900 рублей - сумма в копейках для оплаты после списания 100 баллов "Спасибо".
        static void Main()
        {
            try
            {
                SetFileOutput();

                while (true)
                {

                    Trace.WriteLine("1 - закрыть смену");
                    Trace.WriteLine("2 - произвести списание и возврат");
                    Trace.WriteLine("3 - списание, саспенд, роллбэк");
                    Trace.WriteLine("4 - списание с баллами 'Спасибо'");
                    AuthAnswer13 authAnswer;
                    Trace.WriteLine("Выберите действие:");
                    switch (Console.ReadLine())
                    {
                        case "1":
                            Trace.WriteLine("Закрываем смену");
                            CommandWrapper.CloseDay();
                            Trace.WriteLine("Смена закрыта успешно");
                            break;

                        case "2":
                            Trace.WriteLine("Производим списание");
                            authAnswer = CommandWrapper.Authorization(amount);
                            Trace.WriteLine("Списание произвели. RRN:{authAnswer.RRN}. CardNumber:{authAnswer.CardID}");
                            Trace.WriteLine("Приостанавливаем транзакцию");
                            CommandWrapper.SuspendTransaction(amount);
                            
                            Trace.WriteLine("Транзакция приостановлена. Касса может выполнить рискованные действия.");
                            Trace.WriteLine("Коммитим транзакцию");
                            CommandWrapper.CommitTransaction(amount);
                            Trace.WriteLine("Транзакция успешно закоммичена");
                            Trace.WriteLine("Производим возврат денег на карту");
                            CommandWrapper.ReturnAmountToCard(amount, authAnswer.RRN);
                            Trace.WriteLine("Возврат произведен");
                            break;

                        case "3":
                            Trace.WriteLine("Производим списание");
                            authAnswer = CommandWrapper.Authorization(amount);
                            Trace.WriteLine("Списание произвели. RRN:{authAnswer.RRN}. CardNumber:{authAnswer.CardID}");
                            Trace.WriteLine("Приостанавливаем транзакцию");
                            CommandWrapper.SuspendTransaction(amount);
                            Trace.WriteLine("Транзакция приостановлена");
                            Trace.WriteLine("Производим роллбэк");
                            CommandWrapper.RollBackTransaction(amount);
                            Trace.WriteLine("Произвели роллбэк");
                            break;

                        case "4":
                            Trace.WriteLine("Производим чтение карты. Параметр 'Возвращать промежуточный код ответа' дожен быть установлен.");
                            authAnswer = CommandWrapper.Authorization(amount);
                            // Нужно списать баллы Спасибо для карты с хешом authAnswer.Hash
                            Trace.WriteLine("Карта считана. Хеш карты получен. Списано 100 баллов 'Спасибо'.");
                            if (!CommandWrapper.IsSpasiboFirstCall(authAnswer.ErrorCode))
                                throw new Exception("В пинпаде не установлен параметр 'Возвращать промежуточный код ответа'");

                            authAnswer = CommandWrapper.AuthorizationWithHash(amountAfterSpasibo, authAnswer.Hash);
                            break;
                        default:
                            break;
                    }

                    CommandWrapper.GetFullReport();
                    Console.ReadKey();
                    Console.Clear();
                }

            }
            catch (Exception e)
            {
                Trace.WriteLine(e.Message);
            }

            Console.ReadLine();
        }

        static void SetFileOutput()
        {
            Trace.Listeners.Clear();

            TextWriterTraceListener twtl = new TextWriterTraceListener("log.txt");
            twtl.Name = "TextLogger";
            twtl.TraceOutputOptions = TraceOptions.ThreadId | TraceOptions.DateTime;

            ConsoleTraceListener ctl = new ConsoleTraceListener(false);
            ctl.TraceOutputOptions = TraceOptions.DateTime;

            Trace.Listeners.Add(twtl);
            Trace.Listeners.Add(ctl);
            Trace.AutoFlush = true;

            Trace.WriteLine("Пишем в лог");
        }
    }
}
