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

namespace EsercizioLock
{
    class Fabbrica
    {
        private readonly object lockObj = new object();

        private Vite pezzoProdotto;
        private Random t = new Random();

        private List<Statistiche> stat;

        private bool producendo;

        Thread tProduci;
        Thread tAnalizza;

        public Fabbrica()
        {
            producendo = false;
            stat = new List<Statistiche>();
            for (int i = 5; i <= 50; i++)
            {
                stat.Add(new Statistiche(i));
            }

            tProduci = new Thread(produci);
            tAnalizza = new Thread(analizza);
        }

        public void IniziaProduzione()
        {
            producendo = true;
            tProduci.Start();
            tAnalizza.Start();
        }
        public void StopProduzione()
        {
            producendo = false;
            tProduci.Abort();
            tAnalizza.Abort();
        }

        public string StampaStatistiche()
        {
            string s = String.Empty;
            foreach(Statistiche st in stat)
            {
                s += string.Format("{0:D2}mm:\n  Buoni: {1:D2}\t{2}\n  Scarti: {3:D2}\t{4}",
                    st.Dimensione, st.Buoni, Util.Barra(st.Buoni / 10), st.Scarti, Util.Barra(st.Scarti / 10)) + "\n";
            }
            return s;
        }

        private void produci()
        {
            while (producendo)
            {
                int val = t.Next(5, 51);

                lock (lockObj)
                    pezzoProdotto = new Vite(val);
            }
        }

        private void analizza()
        {
            while (producendo)
            {
                lock (lockObj)
                {
                    if (pezzoProdotto != null)
                    {
                        if (pezzoProdotto.Dimensione < t.Next(5, 51) || pezzoProdotto.Dimensione > t.Next(5, 51))
                            stat[pezzoProdotto.Dimensione - 5].Buoni++; // -5 perchè le dimensioni iniziano da 5.
                        else
                            stat[pezzoProdotto.Dimensione - 5].Scarti++;
                    }

                    pezzoProdotto = null;
                }
            }
        }
    }
}
