﻿using System;
using Photon;
using UnityEngine;

namespace Dissonance.Integrations.PhotonUnityNetworking.Demo
{
    public class PunMenuController
        : PunBehaviour
    {
        private string _guiCreateNamedRoomName = Guid.NewGuid().ToString().Substring(0, 10);

        private State _state;
        private enum State
        {
            JoiningLobby,
            InLobby,
            JoiningRoom,
            CreatingRoom
        }

        private void Start ()
        {
            PhotonNetwork.NetworkStatisticsEnabled = true;
            PhotonNetwork.autoJoinLobby = true;

            PhotonNetwork.ConnectUsingSettings("0.1");
            _state = State.JoiningLobby;
        }

        public override void OnJoinedLobby()
        {
            _state = State.InLobby;
        }

        public override void OnPhotonRandomJoinFailed(object[] codeAndMsg)
        {
            _state = State.InLobby;
        }

        public override void OnPhotonJoinRoomFailed(object[] codeAndMsg)
        {
            _state = State.InLobby;
        }

        public override void OnJoinedRoom()
        {
            PhotonNetwork.LoadLevel("PUN Game World");
        }

        private void OnGUI()
        {
            switch (_state)
            {
                case State.JoiningLobby:
                    GUILayout.Label("Connecting To Photon...");
                    break;

                case State.InLobby:
                    InLobbyGUI();
                    break;

                case State.JoiningRoom:
                    GUILayout.Label("Joining Room...");
                    break;

                case State.CreatingRoom:
                    GUILayout.Label("Creating Room...");
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
            }
        }

        private void InLobbyGUI()
        {
            using (new GUILayout.VerticalScope())
            {
                if (GUILayout.Button(new GUIContent("Join Random Room")))
                {
                    PhotonNetwork.JoinRandomRoom();
                    _state = State.JoiningRoom;
                }

                using (new GUILayout.HorizontalScope())
                {
                    _guiCreateNamedRoomName = GUILayout.TextField(_guiCreateNamedRoomName);

                    if (GUILayout.Button(new GUIContent("Create New Room")))
                    {
                        PhotonNetwork.CreateRoom(_guiCreateNamedRoomName);
                        _state = State.CreatingRoom;
                    }
                }

                var rooms = PhotonNetwork.GetRoomList();
                if (rooms.Length > 0)
                {
                    GUILayout.Label(string.Format("Available Rooms ({0}):", rooms.Length));
                    for (var i = 0; i < rooms.Length; i++)
                    {
                        if (!rooms[i].open)
                            continue;

                        var join = GUILayout.Button(string.Format(" - {0}", rooms[i].name));
                        if (join)
                        {
                            PhotonNetwork.JoinRoom(rooms[i].name);
                            _state = State.JoiningRoom;
                        }
                    }
                }
            }
        }
    }
}
