﻿using System.Collections.Generic;
using UnityEngine;

public class EnvironmentSetup : MonoBehaviour {

    [SerializeField]
    Transform islandsParent;
    [SerializeField]
    Island[] islandTemplates;
    List<Island> islands = new List<Island>();
    public List<Island> IslandsGetter { get { return islands; } }
    [SerializeField]
    int islandsCount = 5;
    [SerializeField]
    Vector3 islandsOffset = new Vector3(0, 0, 30);
    [SerializeField]
    Vector3 islandsRandomOffset = new Vector3(20, 0, 1);
    [SerializeField]
    WindSpline windSplineTemplate;
    WindSpline windSpline;
    public BezierSpline Spline {
        get {
            if (windSpline == null) 
                Generate();
            return windSpline.Spline;
        }
    }

    public delegate void EnvironmentEventHandler();
    public event EnvironmentEventHandler SplineUdpated;

    private void Start()
    {
        Generate();
    }

    public void Generate()
    {
        SpawnIslands();
        UpdateSpline();
    }

    void SpawnIslands()
    {
        islandsParent.DestroyChidren();
        islands.Clear();
        bool right = true;
        for (int i = 0; i < islandsCount; i++)
        {
            Island newIsland = Instantiate(islandTemplates[Random.Range(0, islandTemplates.Length)], islandsParent);
            Vector3 newPosition = transform.position + islandsOffset * (i + 1) + (islandsRandomOffset * Random.value * (right ? 1 : -1));
            newIsland.transform.position = newPosition;
            islands.Add(newIsland);
            right = !right;
        }
    }

    void UpdateSpline()
    {
        foreach (WindSpline spline in GetComponentsInChildren<WindSpline>())
            DestroyImmediate(spline.gameObject);
        windSpline = Instantiate(windSplineTemplate, transform);
        windSpline.IslandsSetter = islands.ToArray();
        windSpline.UpdateSpline();
        // Call event.
        if (SplineUdpated != null)
            SplineUdpated();
    }
}
