﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TP5
{
    internal class CalcModel
    {
        public long nb=0; //Nombre qui est en train d'être tapé
        bool typingDigit = false; //Si l'utilisateur est en train de taper un nombre
        enum Operator { Addition, Substraction, Multiplication, Division };
        List<Operator> operations = new List<Operator>(); //Les opérateurs du calcul courant
        List<long> operandes = new List<long>(); //Les nombres du calcul courant

        /*
	    * Ajoute un chiffre à la droite du nombre
	    */
        public void addDigitRight(long d)
        {
            typingDigit = true;
            nb = nb * 10 + d;//décale les chiffres du nombre vers la gauche
        }

        /*
	    * Ajoute un opérateur pour le calcul
	    */
        public void addOperator(String op)
        {
            //Si l'utilisateur avait précédemment tapé un nombre
            if (typingDigit)
            {
                //Ajoute le nombre qui était en train d'être tapé avant que 
                //l'utilisateur ait appuyé sur l'opérateur
                operandes.Add(nb);
                nb = 0; //Remet le nombre courant à zéro
                switch (op)
                {//Prend le 1er (et seul) caractère du bouton opérateur
                    case "+": operations.Add(Operator.Addition); break;
                    case "-": operations.Add(Operator.Substraction); break;
                    case "*": operations.Add(Operator.Multiplication); break;
                    case "/": operations.Add(Operator.Division); break;
                }
            }
            //L'utilisateur n'est plus en train de taper un nombre
            typingDigit = false;
        }

        /*
	    * Effectue le calcul à partir des vecteurs d'opérateurs et d'opérandes
	    */
        public void calculate()
        {
            //Si l'utilisateur était en train de taper un nombre avant d'appuyer
            //sur "=", ce nombre est ajouté à la liste des opérandes
            if (typingDigit)
            {
                operandes.Add(nb);
            }
            if (operandes.Count > 0)
            {
                //Le premier opérande est ajouté au résultat
                long res = operandes[0];
                //Les opérations successives sont réalisées sur le résultat en
                //prenant en compte les opérandes et opérations séquentiellement
                for (int i = 1; i < operandes.Count; i++)
                {
                    switch (operations[i-1])
                    {
                        case Operator.Addition: res = res + operandes[i]; break;
                        case Operator.Substraction: res = res - operandes[i]; break;
                        case Operator.Multiplication: res = res * operandes[i]; break;
                        case Operator.Division: res = (long)(res / operandes[i]); break;
                    }
                }
                //Le modèle est remis à zéro
                nb = res;
                operations.Clear();
                operandes.Clear();
            }
        }

        /*
         * Remet le modèle à zéro
         */
        public void clear()
        {
            nb = 0;
            typingDigit = false;
            operations.Clear();
            operandes.Clear();
        }


    }
}
