using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class TrackManager : MonoBehaviour {
    [SerializeField]
    GameObject trackList;

    [SerializeField]
    GameObject trackItemPrefab;

    [SerializeField]
    GameObject trackInfo;

    [SerializeField]
    GameObject trackInfoItemPrefab;

    [SerializeField]
    Texture2D[] backgrounds;
    private int currentBackgroundIndex = 0;

    public Text Artist;
    public Text BPM;

    private GameObject selectedTrackItem = null;

    private void TrackBrowse()
    {
        currentBackgroundIndex = (currentBackgroundIndex + 1) % 2;
        trackList.GetComponent<RawImage>().texture = backgrounds[currentBackgroundIndex];

        if (selectedTrackItem != null)
            selectedTrackItem.GetComponentInChildren<Text>().color = Color.white;
        selectedTrackItem = trackList.transform.GetChild(2).gameObject;
        selectedTrackItem.GetComponentInChildren<Text>().color = Color.black;

        if (selectedTrackItem == null)
            return;
        Artist.text = "Artist  :" + selectedTrackItem.gameObject.GetComponent<TrackInfoHolder>().trackInfo.Artist.ToString();
        BPM.text = "BPM    :" + selectedTrackItem.gameObject.GetComponent<TrackInfoHolder>().trackInfo.BPM.ToString();

        for (int i = 0; i < trackInfo.transform.childCount; i++)
            Destroy(trackInfo.transform.GetChild(i).gameObject);

        foreach (string trackItem in selectedTrackItem.gameObject.GetComponent<TrackInfoHolder>().trackInfo.TrackList)
        {
            Instantiate(trackInfoItemPrefab, trackInfo.transform).GetComponent<Text>().text = trackItem;
        }
    }

    // Use this for initialization
    void Start()
    {
        LoadTracks();
        TrackBrowse();
    }
	
    // Update is called once per frame
    void Update()
    {
        if (trackList.transform.childCount < 0)
            return;

        if (Input.GetKeyDown(KeyCode.DownArrow))
        {
            trackList.transform.GetChild(0).SetAsLastSibling();
            TrackBrowse();
        }
        if (Input.GetKeyDown(KeyCode.UpArrow))
        {
            trackList.transform.GetChild(trackList.transform.childCount - 1).SetAsFirstSibling();
            TrackBrowse();
        }
        if (InputManager.Instance.IsButtonPressed)
            StartTrack();
    }
    
    void LoadTracks()
    {
        foreach (TrackInfo track in LoadTrackInfos())
        {
            var trackItem = Instantiate(trackItemPrefab, trackList.transform);

            trackItem.AddComponent<TrackInfoHolder>().trackInfo = track;
        }
    }

    List<TrackInfo> LoadTrackInfos()
    {
        var files = new DirectoryInfo("Assets/Tracks").GetFiles("*.bpe", SearchOption.AllDirectories);

        var tracks = files.Select(s => new TrackInfo(s)).ToList();
        while (tracks.Count() < 5)
            tracks.AddRange(tracks);

        return tracks;
    }

    public void StartTrack()
    {
        // TODO: disable start button if nothing selected

        var holder = selectedTrackItem.GetComponent<TrackInfoHolder>();

        GameManager.Instance.CurrentTrack = holder.trackInfo;

        Destroy(GetComponent<InputManager>());
        Destroy(this);

        GameManager.Instance.SceneTransition("InGame");
    }
}