using System;
using System.Collections;
using System.Diagnostics;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.SceneManagement;
using static CommunicationEvents;


public class CheckServer : MonoBehaviour
{
    [SerializeField]
    TMPro.TextMeshProUGUI WaitingText;

    public static Process process;
    public static ProcessStartInfo processInfo;
    


    // Start is called before the first frame update
    void Start()
    {
        //CommunicationEvents.ServerRunning = false;
        //StartCoroutine(ServerRoutine());

        StartCoroutine(waiter(CommunicationEvents.lastIP, 1, CommunicationEvents.IPcheckGeneration));
        StartCoroutine(waiter(CommunicationEvents.newIP, 2, CommunicationEvents.IPcheckGeneration));
        StartCoroutine(waiter(CommunicationEvents.IPslot1, 3, CommunicationEvents.IPcheckGeneration));
        StartCoroutine(waiter(CommunicationEvents.IPslot2, 4, CommunicationEvents.IPcheckGeneration));
        StartCoroutine(waiter(CommunicationEvents.IPslot3, 5, CommunicationEvents.IPcheckGeneration));
        StartCoroutine(waiter(CommunicationEvents.IPslot3, 6, CommunicationEvents.IPcheckGeneration));


    }

    public void CheckIPAdr()
    {
        //CommunicationEvents.ServerRunning = false;
        //StartCoroutine(ServerRoutine());

        //CommunicationEvents.IPcheckGeneration++;
        //StartCoroutine(waiter(CommunicationEvents.lastIP, 1, CommunicationEvents.IPcheckGeneration));
        //StartCoroutine(waiter(CommunicationEvents.newIP, 2, CommunicationEvents.IPcheckGeneration));
        //StartCoroutine(waiter(CommunicationEvents.IPslot1, 3, CommunicationEvents.IPcheckGeneration));
        //StartCoroutine(waiter(CommunicationEvents.IPslot2, 4, CommunicationEvents.IPcheckGeneration));
        //StartCoroutine(waiter(CommunicationEvents.IPslot3, 5, CommunicationEvents.IPcheckGeneration));


    }


    IEnumerator waiter(String NetwAddress, int NA_id, double ics)
    {




        //while(CommunicationEvents.IPcheckGeneration== ics)
        while (CommunicationEvents.CheckNetLoop == 1)
        {

            switch(NA_id){
                case 1:
                    NetwAddress = CommunicationEvents.lastIP;
                    break;
                case 2:
                    NetwAddress = CommunicationEvents.newIP;
                    break;
                case 3:
                    NetwAddress = CommunicationEvents.IPslot1;
                    break;
                case 4:
                    NetwAddress = CommunicationEvents.IPslot2;
                    break;
                case 5:
                    NetwAddress = CommunicationEvents.IPslot3;
                    break;
                case 6:
                    NetwAddress = CommunicationEvents.selecIP;
                    break;
                    //default:


            }

            if (string.IsNullOrEmpty(NetwAddress))
            {
                //Wait for 1 seconds
                CommunicationEvents.ServerRunningA[NA_id] = 3;
                yield return new WaitForSecondsRealtime(1f);
            }
            else
            {
                StartCheck(NetwAddress, NA_id, ics);
                //Wait for 0,5 seconds
                yield return new WaitForSecondsRealtime(0.5f);
                if (CommunicationEvents.IPcheckGeneration <= ics || (NA_id != 6))// && NA_id != 2))
                {
                    //if (CommunicationEvents.IPcheckGeneration < ics) { break; }
                    if (CommunicationEvents.ServerRunningA_test[NA_id] == true)
                    {
                        CommunicationEvents.ServerRunningA[NA_id] = 2;
                    }
                    else
                    {
                        CommunicationEvents.ServerRunningA[NA_id] = 0;
                    }
                    //Wait for 0,5 seconds
                    yield return new WaitForSecondsRealtime(0.5f);
                }
                else
                {

                    CommunicationEvents.IPcheckGeneration--;

                    if (NA_id == 2)
                    {
                        CommunicationEvents.ServerRunningA[NA_id] = 1;
                        //Wait for 0,5 seconds
                        yield return new WaitForSecondsRealtime(0.5f);
                    }

                }

            }


        }
    }

        public void StartCheck(String NetwAddress, int NA_id, double ics)
    {
        CommunicationEvents.ServerRunningA_test[NA_id] = false;
        StartCoroutine(ServerRoutine(NetwAddress, NA_id, ics));
    }

    void PrepareGame()
    {
        //WaitingText.text = "Press any key to start the game";
        //CommunicationEvents.ServerRunning_test = true;
        //UnityEngine.Debug.Log("server fin");

    }

    IEnumerator ServerRoutine(String NetwAddress, int NA_id, double ics)
    {
        UnityWebRequest request = UnityWebRequest.Get("http://" + NetwAddress + "/scroll/list");

        yield return request.SendWebRequest();
        if (request.result == UnityWebRequest.Result.ConnectionError
         || request.result == UnityWebRequest.Result.ProtocolError)
        {
            UnityEngine.Debug.Log("no running server " + request.error);


            while (true)
            {
                request = UnityWebRequest.Get("http://" + NetwAddress + "/scroll/list");
                yield return request.SendWebRequest();
                if (request.result == UnityWebRequest.Result.ConnectionError
                 || request.result == UnityWebRequest.Result.ProtocolError)
                {
                    // UnityEngine.Debug.Log("no running server");
                }
                else
                {
                    break;
                }



                yield return null;
            }
        }

        //PrepareGame(); 
        if (CommunicationEvents.IPcheckGeneration == ics || (NA_id!=6))// && NA_id!=2))
        {
            CommunicationEvents.ServerRunningA_test[NA_id] = true;
        }
        yield return null;
    }

    


    void Update()
    {
        
    }

}