using Cysharp.Threading.Tasks;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class SceneLoader : MonoBehaviour
{
    [SerializeField] private int baseSceneIndex;

    private bool isLoaded;
    private int currentScene = 0;
    public int prevScene = 0;

    private void Awake()
    {
        currentScene = baseSceneIndex; // holt sich den Index der aktuellen Szene
    }
    public void LoadScene(string sceneName) // ist die Funktion zum gewögnlichen Laden von Szenen
    {
        SceneManager.LoadScene(sceneName);
    }

    public void LoadNextSceneAdditive() // Lädt die nach Index nächste Szene additiv hinzu. Wird asynchron ausgeführt.
    {
        Debug.LogError("Triggered");
        if (currentScene >= SceneManager.sceneCountInBuildSettings - 1 || SceneManager.loadedSceneCount > 2) return; // die aktuelle Szene darf nicht die letzte sein und es dürfen nöch keine zwei Szenen geladen sein.
        int nextScene = currentScene + 1; // setzt den Index für die nächste Szene
        prevScene = currentScene; // die aktuelle Szene wird zur "Previous Scene". Nun kann sie entladen werden.
        currentScene = nextScene; // die nächste Szene wird zur neuen "Current Scene".
        SceneManager.LoadSceneAsync(nextScene, LoadSceneMode.Additive); // nun wird die nächste Szene (in diesem moment dieselbe wie "Current Scene" asynchron hinzugeladen.
        Debug.Log("Loaded Scene " + nextScene);
    }

    public void UnloadPrevSceneAdditive() // Entlädt die Szene, deren Index als "Previous Scene" festgehalten ist.
    {
        if (prevScene == baseSceneIndex) return; // Wird nicht ausgeführt, wenn die "Previous Scene" die Basis-Szene ist.
        SceneManager.UnloadSceneAsync(prevScene); // Die "Previous Scene" wird entladen.
        if (SceneManager.GetSceneByName("CurrentResults").isLoaded)
        {
            SceneManager.UnloadSceneAsync("CurrentResults");
            Debug.Log("Unloaded CurrentResults");
        }
    }
    public void LoadResultsAdditive() // Lädt die Results zur aktuellen Szene
    {
        SceneManager.LoadScene("CurrentResults", LoadSceneMode.Additive);
    }

    public void NewRoom()
    {
        LoadNewRoom();
    }

    private async UniTaskVoid LoadNewRoom() // Aktuelle Methode zum Laden von Szenen
    {
        int sceneCount = SceneManager.sceneCount;

        for (int i = 0; i < sceneCount; i++)
        {
            Scene myScene = SceneManager.GetSceneAt(i);
            if (myScene.isLoaded && myScene != SceneManager.GetSceneByBuildIndex(baseSceneIndex))
            {
                currentScene = myScene.buildIndex;
                await SceneManager.UnloadSceneAsync(myScene);
            }
        }
        if (currentScene == SceneManager.sceneCountInBuildSettings-1)
        {
            await SceneManager.LoadSceneAsync(baseSceneIndex); // Lädt die Basis-Szene komplett neu, falls vorherige Szene die letzte war.
        }
        else
        {
            await SceneManager.LoadSceneAsync(currentScene + 1, LoadSceneMode.Additive); // Lädt die nächste Szene additiv
            Debug.Log("Loaded Room " + (currentScene + 1));
        }
        
    }
}
