using Photon.Pun;
using Photon.Realtime;
using TMPro;
using UnityEngine;

public class FindOpponentManager : MonoBehaviourPunCallbacks
{
    #region Zmienne / Variables 
    public TMP_Text waitingStatusText = null;
    public Animator _animator;

    private bool isConnecting = false;

    private const string GameVersion = "1.6";
    private const int maxPlayersPerRoom = 2;

    public GameObject _storeIcons;
    private int _countdown = 3;

    public EnergyManager _energy;
    public LoadSceneScript _loadSceneScript;
    public ConnectToServer _connectToServer;
    public TMP_Text _ownerNickname;
    public TMP_Text _opponentNickname;

    #endregion

    private void Awake() => PhotonNetwork.AutomaticallySyncScene = true;

    public void FindOpponent()
    {
        isConnecting = true;
        if (_energy.totalEnergy > 0)
        {
            _energy.UseEnergy();
            _animator.Play("findopponent_open");
            _connectToServer.enabled = true;

            PhotonNetwork.LocalPlayer.NickName = PlayerPrefs.GetString("username");
            waitingStatusText.text = "Searching ...";

            if (PhotonNetwork.IsConnected)
            {
                PhotonNetwork.JoinRandomRoom();
            }
            else
            {
                PhotonNetwork.GameVersion = GameVersion;
                PhotonNetwork.ConnectUsingSettings();
            }
        }
        else if( _energy.totalEnergy == 0)
        {
            isConnecting = false;
            _animator.Play("store_open_noEnergy");
            return;
        }
    }

    public void OnClick_LeaveTheRoom()
    {
        PhotonNetwork.LeaveRoom(true);
        _animator.Play("findopponent_close");
        _energy.totalEnergy += 1;
    }

    public override void OnConnectedToMaster()
    {
        Debug.Log("Connected To Master");

        if(isConnecting)
        {
            PhotonNetwork.JoinRandomRoom();
        }
    }

    public override void OnDisconnected(DisconnectCause cause)
    {
        _animator.Play("findopponent_close");
        _energy.totalEnergy += 1;
        Debug.Log($"Disconnect due to: {cause}");
    }

    public override void OnJoinRandomFailed(short returnCode, string message)
    {
        Debug.Log("No clients are waiting for an opponent, creating new room");

        PhotonNetwork.CreateRoom(null, new RoomOptions { MaxPlayers = maxPlayersPerRoom });
    }

    public override void OnJoinedRoom()
    {
        Debug.Log("Client successfully joined a room");
        int playerCount = PhotonNetwork.CurrentRoom.PlayerCount;
        //_ownerNickname.text = PlayerPrefs.GetString("username").ToString();

        PhotonNetwork.LocalPlayer.NickName = PlayerPrefs.GetString("username").ToString();
        _ownerNickname.text = PhotonNetwork.LocalPlayer.NickName.ToString();


        if (playerCount != maxPlayersPerRoom)
        {
            waitingStatusText.text = "Waiting for opponent";
            Debug.Log("Client is waiting for an opponent");
        }
        else
        {
            waitingStatusText.text = "Opponent Found";
            photonView.RPC("OpponentNickname", RpcTarget.Others);

            Debug.Log("Matching is ready to begin");
        }
    }

    public override void OnPlayerEnteredRoom(Player newPlayer)
    {
        if (PhotonNetwork.CurrentRoom.PlayerCount == maxPlayersPerRoom)
        {
            PhotonNetwork.CurrentRoom.IsOpen = false;
            Debug.Log("Match is ready to begin");

            waitingStatusText.text = "Opponent Found";
            Debug.Log("Match is ready begin");

            _loadSceneScript.StartCoroutine("StartGlobalGameScene");
        }
    }

    public override void OnLeftRoom()
    {
        Debug.Log("Player left the photon room");
    }

    [PunRPC]
    private void OpponentNickname()
    {
        PhotonNetwork.LocalPlayer.NickName = PlayerPrefs.GetString("username").ToString();
        _opponentNickname.text = PlayerPrefs.GetString("username").ToString();
    }
}