﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
using UnityEngine.SceneManagement;

public class GameLogicManager : MonoBehaviour {

    public PlayersRemainingDisplay playersRemainingDisplay; // has the number of players remaining 
    BasicCameraBehaviour basicCameraBehaviour;
    public RoundOverDisplay roundOverDisplay; // handles the game over screen stuff
    public StartMatch startMatch;
    GameObject player;
    bool localPlayerFound = false;

    void Start() {
        Transform camPivot = GameObject.FindGameObjectWithTag("Camera Pivot").transform;
        basicCameraBehaviour = camPivot.GetChild(0).GetComponent<BasicCameraBehaviour>();
    }

    void Update() {
        if(PhotonNetwork.IsConnected && PhotonNetwork.CurrentRoom != null) {
            if (playersRemainingDisplay.GetRemainingPlayers() != -1 && playersRemainingDisplay.GetRemainingPlayers() <= 1 && !roundOverDisplay.IsRoundOver()) {
                roundOverDisplay.ShowWinner();
            }
            if(playersRemainingDisplay.GetRemainingPlayers() != -1 && !IsCurrentlyPlaying() && !IsCurrentlySpectatingPlayer() && !startMatch.spawningPlayer) {
                Transform t = PlayerBase.GetNewCameraTargetTransform();
                if (t) {
                    player = t.gameObject;
                    t.GetComponent<PlayerBase>().SetSpectating(true);
                    basicCameraBehaviour.ChangeCameraTarget(t);
                }
            }
        }
    }

    public void ReturnToLobby() {
        StartCoroutine(TotalDisconnect());
    }

    IEnumerator TotalDisconnect() {
        if (PhotonNetwork.InRoom) {
            PhotonNetwork.LeaveRoom();
        }

        PhotonNetwork.Disconnect();

        while (PhotonNetwork.IsConnected) {
            Debug.Log("waiting");
            yield return null;
        }

        SceneManager.LoadScene(0);
    }

    bool IsCurrentlyPlaying() {
        if (localPlayerFound && player)
            return true;
        if (!PhotonNetwork.IsConnected) {
            player = GameObject.FindGameObjectWithTag("Player");
            return player != null;
        }

        GameObject[] players = GameObject.FindGameObjectsWithTag("Player");
        for (int i = 0; i < players.Length; i++) {
            PhotonView view = players[i].GetPhotonView();
            if (view && view.IsMine) {
                player = players[i];
                localPlayerFound = true;
                return true;
            }
        }
        return false;
    }

    bool IsCurrentlySpectatingPlayer() {
        if (!PhotonNetwork.IsConnected) {
            return false;
        }

        GameObject[] players = GameObject.FindGameObjectsWithTag("Player");
        for (int i = 0; i < players.Length; i++) {
            PhotonView view = players[i].GetPhotonView();
            if (view && !view.IsMine && players[i].GetComponent<PlayerBase>().IsSpectating())
                return true;
        }
        return false;
    }
}
