﻿using UnityEngine;

public class PickupsSpawner : MonoBehaviour {

    [SerializeField]
    Transform[] pickupPrefabs;
    [SerializeField]
    Vector2 minMaxOnSpline = new Vector2(.2f, .9f);
    [SerializeField]
    Vector2 minMaxOffset = new Vector2(-1, 1);
    float RandomProgression { get { return Random.Range(minMaxOnSpline.x, minMaxOnSpline.y); } }
    Transform map;
    Transform boussole;
    Transform pieces;
    [SerializeField]
    int piecesAmount = 15;


    EnvironmentSetup environment;

    Transform pickupsParent;
    string pickupsParentName = "PickupsParent";

    private void Start()
    {
        SetupVars();
        // Spawn the pikcups when the environment is setup.
        if (environment != null)
            environment.SplineUdpated += SpawnPickups;
    }


    #region Setup variables ----------------
    bool varsSetup = false;
    void SetupVars()
    {
        if (varsSetup)
            return;

        // Get spline.
        environment = GetComponent<EnvironmentSetup>();
        if (environment == null)
            return;

        // Create pickupsParent.
        if (transform.Find(pickupsParentName) == null)
        {
            GameObject newPickupsParent = new GameObject(pickupsParentName);
            pickupsParent = newPickupsParent.transform;
            pickupsParent.parent = transform;
        }
        else
        {
            pickupsParent = transform.Find(pickupsParentName);
        }

        // Get pickup types.
        foreach (Transform pickup in pickupPrefabs)
        {
            Pick_Item item = pickup.GetComponentInChildren<Pick_Item>();
            if (item != null)
            {
                switch (item.type)
                {
                    case Pick_Item.pickUpType.map:
                        map = pickup;
                        break;
                    case Pick_Item.pickUpType.boussole:
                        boussole = pickup;
                        break;
                    case Pick_Item.pickUpType.pieces:
                        pieces = pickup;
                        break;
                    default:
                        break;
                }
            }
        }
        varsSetup = true;
    }
    #endregion --------------------------------


    public void SpawnPickups()
    {
        SetupVars();
        DestroyPickups();
        if (pickupPrefabs.Length < 1 || pickupsParent == null)
            return;
        // Spawn map, boussole, pieces.
        SpawnPickupOnSpline(map, RandomProgression);
        SpawnPickupOnSpline(boussole, RandomProgression);
        for (int i = 0; i < piecesAmount; i++)
        {
            SpawnPickupOnSpline(pieces, RandomProgression);
        }
    }

    void SpawnPickupOnSpline(Transform tr, float splineProgress)
    {
        // Spawn a transform on our spline, with a random offset perpendicular to the spline.
        Transform newTR = Instantiate(tr.gameObject, pickupsParent).transform;
        Vector3 onSplinePosition = environment.Spline.GetPoint(splineProgress);
        float randomXOffset = Random.Range(minMaxOffset.x, minMaxOffset.y);
        Vector3 offset = Quaternion.Euler(0, 90, 0) * environment.Spline.GetDirection(splineProgress);
        offset *= randomXOffset;
        newTR.position = onSplinePosition + offset;
    }

    public void DestroyPickups()
    {
        SetupVars();
        if (environment == null)
            return;
        // Destroy every child of pickups parent.
        pickupsParent.DestroyChidren();
    }
}
