using System.Collections.Generic;
using System.Linq;
using Assets.Common;
using Assets.Voronoi;

namespace Assets.Map
{
    public class Location
    {
        public List<Site> Sites = new List<Site>();

        public IEnumerable<int> Points => Sites.SelectMany(site => site.Vertices);
        public IEnumerable<int> BoundaryPoints => BoundaryEdges.SelectMany(edge => new [] { edge.Item1, edge.Item2 }).Distinct();
        public IEnumerable<int> InsidePoints => Points.Except(BoundaryPoints);
        
        public List<(int, int)> BoundaryEdges = new List<(int, int)>();

        public Point Center => PointUtils.Mean(Sites.Select(s => s.Point));
        
        public LocationType Type;

        public List<Point> DetailedEdge = new List<Point>();

        public void AddSite(Site site)
        {
            site.Location = this;
            Sites.Add(site);
            
            FixBoundaryEdges(site);
        }
        
        private void FixBoundaryEdges(Site site)
        {
            var a = BoundaryEdges;
            var b = site.Edges.Select(x => x.Item1 < x.Item2 ? x : (x.Item2, x.Item1));

            BoundaryEdges = a.Union(b).Except(a.Intersect(b)).ToList();
        }
    }
    
    public class LocationSite
    {
        public readonly Site Site;
        public Location Location;

        public LocationSite(Site site)
        {
            Site = site;
        }
    }
}