
// Created with MonoDevelop
//
//    QuickStep: Acquire, view and identify spectra 
//    Copyright (C) 2024. Hiperscan GmbH Dresden, Germany
//
//    This program is free software: you can redistribute it and/or modify
//    it under the terms of the GNU General Public License as published by
//    the Free Software Foundation, either version 3 of the License, or
//    (at your option) any later version.
//
//    This program is distributed in the hope that it will be useful,
//    but WITHOUT ANY WARRANTY; without even the implied warranty of
//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//    GNU General Public License for more details.
//
//    You should have received a copy of the GNU General Public License
//    along with this program.  If not, see <http://www.gnu.org/licenses/>.

using System;
using System.Linq;
using System.Collections.Generic;

using Hiperscan.Unix;
using Hiperscan.Spectroscopy;

namespace Hiperscan.Extensions.ReferenceCheck.Control.Acquisition
{
    public class AcquisitionSessions
    {
        public void GetNextSession()
        {
            this.SessionIndex++;
            if (this.SessionIndex >= this.SessionQuue.Count)
                throw new Exception(Catalog.GetString("There are no further sessions available."));

            this.CurrentSession = this.SessionQuue[this.SessionIndex];
        }

        public void AddSession(int id, int number_of_acquisitions)
        {
            AcquisitionSession session = new AcquisitionSession(id, number_of_acquisitions);

            if (this.SessionQuue.Any(item => item.Id == id))
                throw new Exception(Catalog.GetString("The session ID has already been added"));

            this.SessionQuue.Add(session);
            this.SessionQuue.Sort();
        }

        public void AddSpectrum(string serial, Spectrum spectrum)
        {
            this.CurrentSession.AddSpectrum(serial, spectrum);
        }

        public bool SerialExists(string serial)
        {
            return this.SessionQuue.Any(x => x.Spectra.ContainsKey(serial));
        }

        public bool IsCurrentSessionComplete
        {
            get
            {
                return this.CurrentSession.AcquisitionsIsCompleted;
            }
        }

        public bool AllSessionsComplete
        {
            get
            {
                return this.SessionQuue.Any(item => item.AcquisitionsIsCompleted == false) == false;
            }
        }

        public int SpectraCount
        {
            get
            {
                return this.SessionQuue.Select(x => x.Spectra.Count).Sum();
            }
        }

        public int CurrentSessionId
        {
            get
            {
                return this.CurrentSession.Id;
            }
        }

        public int CurrentSpectraCount
        {
            get
            {
                return this.CurrentSession.Spectra.Count;
            }
        }

        public int CurrentMaxAcquisitionCount
        {
            get
            {
                return this.CurrentSession.NumberOfAcquisitions;
            }
        }

        private AcquisitionSession CurrentSession { get; set; } = null;
        public List<AcquisitionSession> SessionQuue { get; private set; } = new List<AcquisitionSession>();
        private int SessionIndex { get; set; } = -1;
    }
}
