﻿using UnityEngine;
using CI.TaskParallel;
using UnityEngine.UI;

public class ExampleSceneManagerController : MonoBehaviour
{
    public Text ResultText;

    public void Start()
    {
        UnityTask.InitialiseDispatcher();
    }

    public void CreateAndRun()
    {
        UnityTask.Run(() =>
        {
            var result = FindPrimeNumber(1000);
        });
    }

    public void WaitAndReturnAValue()
    {
        UnityTask<long> unityTask = UnityTask.Run(() =>
        {
            return FindPrimeNumber(10000);
        });

        UnityTask.WaitAll(unityTask);

        long result = unityTask.Result;
    }

    private int frameNumber,requestNumber;
    void LateUpdate()
    {
        frameNumber++;
    }

    private int firstFrame = 0;

    public void ReallyDoReturnValueToUIThread()
    {
        firstFrame = frameNumber;
        int thisRequestNumber = requestNumber;
        requestNumber++;
        int PrimeToGet = Random.Range(10000, 12000);
        //Debug.Log("[" + thisRequestNumber + "]" + "[" + frameNumber + "] started running to find "+PrimeToGet);
        UnityTask.Run(() =>
        {
            return FindPrimeNumber(PrimeToGet);
        }).ContinueOnUIThread((r) =>
        {
            Debug.Log("[" + thisRequestNumber + "]" + "[" + frameNumber + "] "+ PrimeToGet + " prime number result " + r.Result.ToString()+" total elapsed "+(frameNumber-firstFrame));
            ResultText.text = "The result is: " + r.Result.ToString();
            
        });
    }

    public void ReturnAValueToTheUIThread()
    {
        for (int i = 0; i < 100; i++)
        {
            ReallyDoReturnValueToUIThread();
        }
    }

    public void CreateContinuation()
    {
        UnityTask<long> unityTask = UnityTask.Run(() =>
        {
            return FindPrimeNumber(1000);
        }).ContinueWith((r) =>
        {
            return FindPrimeNumber((int)r.Result);
        });
    }

    public long FindPrimeNumber(int n)
    {
        int count = 0;
        long a = 2;
        while (count < n)
        {
            long b = 2;
            int prime = 1;
            while (b * b <= a)
            {
                if (a % b == 0)
                {
                    prime = 0;
                    break;
                }
                b++;
            }
            if (prime > 0)
            {
                count++;
            }
            a++;
        }
        return (--a);
    }
}