using UnityEngine;
using System;
using System.Collections.Generic;

namespace mgaia.Utils
{
    /// <summary>
    /// Classe que representa um semáforo
    /// </summary>
    /// <owner>Victor</owner>
    public class Semaphore
    {
        private Action<Semaphore> mStateChangedHandler;
        private uint _mNumberOfLocks;

        public uint NumberOfLocks
        {
            get { return _mNumberOfLocks; }
        }

        /// <summary>
        /// Retorna se o semáforo está travado
        /// </summary>
        public bool IsLocked
        {
            get { return _mNumberOfLocks > 0; }
        }

        public Semaphore(Action<Semaphore> stateChangedHandler)
        {
            mStateChangedHandler = stateChangedHandler;
        }

        /// <summary>
        /// Adiciona uma trava ao semáforo
        /// </summary>
        public void AddLock()
        {
            if (_mNumberOfLocks++ == 0)
            {
                if (mStateChangedHandler != null)
                {
                    mStateChangedHandler(this);
                }
            }
        }

        /// <summary>
        /// Remove uma trava do semáforo
        /// </summary>
        public void RemoveLock()
        {
            if (_mNumberOfLocks > 0)
            {
                _mNumberOfLocks--;

                if (_mNumberOfLocks == 0)
                {
                    if (mStateChangedHandler != null)
                    {
                        mStateChangedHandler(this);
                    }
                }
            }
        }
    }
}