using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Random = System.Random;

namespace Assets.Map
{
    public class LocationGenerator
    {
        private Graph<Location> _graph;
        private readonly List<(int, Color)> _queue = new List<(int, Color)>();
        private Random _random;

        public bool Done => _queue.Count == 0;
        public Graph<Location> Result => _graph;

        public LocationGenerator(Graph<Location> graph, Random random = null)
        {
            _graph = graph;
            _random = random ?? new Random();
        }

        public void Init(params (int, Color)[] start)
        {
            foreach (var pair in start)
                _queue.Add(pair);
        }

        private (int, Color) Dequeue()
        {
            while (_queue.Count > 0)
            {
                var index = _random.Next(_queue.Count);
                var pair  = _queue[index];

                _queue.RemoveAt(index);

                if (_graph.Vertices[pair.Item1].Type == Color.clear) return pair;
            }
            
            throw new Exception("No more elements.");
        }
        
        public void Step()
        {
            try
            {
                var (vertex, color) = Dequeue();

                _graph.Vertices[vertex].Type = color;

                foreach (var neighbour in _graph.Neighbours(vertex))
                    if (_graph.Vertices[neighbour].Type == Color.clear)
                        _queue.Add((neighbour, color));
            }
            catch (Exception ex)
            {
            }
        }
    }
}