using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering.Universal;

public class AblaufKleinerStern3 : MonoBehaviour
{
    public GameObject mariaAufEsel;
    public GameObject joseph;
    public GameObject hase;
    public GameObject kleinerStern;
    public GameObject globalLight;

    private Action nextStep;
    private class Task {
        private Action action;
        private float time;
        
        public Task(Action action, float time){
            this.action = action;
            this.time = time;
        }

        public bool isDue(){
            return Time.time >= time;
        }

        public void Do(){
            action();
        }
    }
    private List<Task> taskList;

    // Start is called once before the first execution of Update after the MonoBehaviour is created
    void Start()
    {
        nextStep = AuftrittMariaUndJoseph;
        taskList = new();
        mariaAufEsel.transform.position = new Vector2(targetMaria - mariaJosephStreckeAuftritt,  -1.5f);
        joseph.transform.position = new Vector2(targetJoseph - mariaJosephStreckeAuftritt, -2.81f);
        kleinerStern.transform.position = new Vector2(10.2f, 3.0f);
        hase.transform.position = new Vector2(10.5f, -4.33f);
        hase.GetComponent<Rigidbody2D>().simulated = false;
        globalLight.GetComponent<Light2D>().intensity = 0;
    }

    // Update is called once per frame
    void Update()
    {
        List<Task> newlist = new();
        foreach (Task t in taskList){
            if (t.isDue()){
                t.Do();
            } else {
                newlist.Add(t);
            }
        }
        taskList = newlist;
        if (Input.GetKeyDown(KeyCode.Space)){
            nextStep();
        }
    }

    private void scheduleNewTask(float timeFromNow, Action action){
        Task t = new(action, Time.time + timeFromNow);
        taskList.Add(t);
    }

    private const float targetJoseph = -1.1f;
    private const float targetMaria = -5.5f;
    private const float targetStern = 3.5f;
    private const float targetHase = 5.0f;
    private const float kleinesStueck = 1.0f;
    private const float mariaJosephStreckeAuftritt = 6.5f;
    private void AuftrittMariaUndJoseph(){
        globalLight.GetComponent<Lichtsteuerung>().FadeToIntensity(1, 0.5f);
        FigurMitBeinenBewegung josephBewegung = joseph.GetComponent<FigurMitBeinenBewegung>();
        josephBewegung.GoToXPosition(targetJoseph);
        mariaAufEsel.GetComponent<FigurMitBeinenBewegung>().GoToXPosition(targetMaria);
        scheduleNewTask(mariaJosephStreckeAuftritt/josephBewegung.movementVelocity + 0.2f, delegate(){
            josephBewegung.GoToXPosition(targetJoseph - 0.01f);
        });
        nextStep = AuftrittKleinerStern;
    }

    private void AuftrittKleinerStern(){
        kleinerStern.GetComponent<SternBewegung>().GoToPositionWithVelocity(new Vector2(targetStern, 3.0f), 1);
        HaseBewegung haseBewegung = hase.GetComponent<HaseBewegung>();
        haseBewegung.Turn();
        haseBewegung.GoToXPosition(targetHase);
        hase.GetComponent<Rigidbody2D>().simulated = true;
        scheduleNewTask(1.5f, delegate(){
            joseph.GetComponent<FigurMitBeinenBewegung>().GoToXPosition(targetJoseph);
        });
        nextStep = EinStueckWeiter;
    }

    private void EinStueckWeiter(){
        joseph.GetComponent<FigurMitBeinenBewegung>().GoToXPosition(targetJoseph + kleinesStueck);
        mariaAufEsel.GetComponent<FigurMitBeinenBewegung>().GoToXPosition(targetMaria + kleinesStueck);
        scheduleNewTask(0.5f, delegate(){
            kleinerStern.GetComponent<SternBewegung>().GoToPositionWithVelocity(new Vector2(targetStern + kleinesStueck, 3.0f), 1);
            HaseBewegung haseBewegung = hase.GetComponent<HaseBewegung>();
            haseBewegung.Turn();
            haseBewegung.GoToXPosition(targetHase + kleinesStueck);
        });
        nextStep = Abgang;
    }

    private void Abgang(){
        joseph.GetComponent<FigurMitBeinenBewegung>().GoToXPosition(20);
        mariaAufEsel.GetComponent<FigurMitBeinenBewegung>().GoToXPosition(20);
        scheduleNewTask(0.5f, delegate(){
            kleinerStern.GetComponent<SternBewegung>().GoToPositionWithVelocity(new Vector2(20, 3.0f), 1);
            hase.GetComponent<HaseBewegung>().GoToXPosition(20);
        });
        scheduleNewTask(3, delegate(){
            globalLight.GetComponent<Lichtsteuerung>().FadeToIntensity(0, 1);
        });
        nextStep = delegate(){};
    }
}
