using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using UnityEngine.SceneManagement;
using System;
using System.Security.Cryptography;
using System.Text;

public class Login : MonoBehaviour {

    public GameObject username;
    public GameObject password;

    public Button loginButton;

    public Text errorText;

    private string Username;
    private string Password;
    private string loginUrl = "http://nordh.xyz/narKampen/dbFiles/Login.php?";
    private Color errorColor;
    private EventSystem system;

    [Serializable]
    public class User {
        public string userId;
        public string pass;
        public string salt;
    }

    private void Start() {
        loginButton.onClick.AddListener(loginAction);
        errorColor = errorText.color;
        system = EventSystem.current;
    }

    private void Update() {
        Username = username.GetComponent<InputField>().text;
        Password = password.GetComponent<InputField>().text;

        if (Input.GetKeyDown(KeyCode.Tab)) {
            Selectable next = system.currentSelectedGameObject.GetComponent<Selectable>().FindSelectableOnDown();

            if (next != null) {

                InputField inputfield = next.GetComponent<InputField>();
                if (inputfield != null) inputfield.OnPointerClick(new PointerEventData(system));  //if it's an input field, also set the text caret

                system.SetSelectedGameObject(next.gameObject, new BaseEventData(system));
            }
        }
    }

    void loginAction() {
        string errorMessage = "";
        if (Username == "") {
            errorMessage = "Username is required";
        }
        if (Password == "") {
            if (errorMessage != "") {
                errorMessage += "\n";
            }
            errorMessage += "Password is required";
        }

        if (errorMessage == "") {
            errorColor.a = 0;
            StartCoroutine(loginCall());
        } else {
            errorText.text = errorMessage;
            errorColor.a = 1;
        }
        errorText.color = errorColor;
    }

    IEnumerator loginCall() {
        string postUrl = loginUrl + "name=" + UnityWebRequest.EscapeURL(Username);

        UnityWebRequest www = UnityWebRequest.Get(postUrl);
        yield return www.SendWebRequest();

        if (www.error != null) {
            errorText.text = "There was an error logging in " + www.error;
        }
        string result = www.downloadHandler.text;

        User u = new User();
        JsonUtility.FromJsonOverwrite(result, u);

        if (!u.userId.Equals("")) {
            byte[] pwd = Encoding.UTF8.GetBytes(u.salt + Password);
            SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();
            string pass = Convert.ToBase64String(sha1.ComputeHash(pwd));
            if (pass.Equals(u.pass)) {
                errorColor.a = 0;
                errorText.color = errorColor;
                Int32.TryParse(u.userId, out int userId);
                PlayerPrefs.SetInt("UserId", userId);
                // load next scene
                SceneManager.LoadScene("MainMenu");
            } else {
                errorText.text = "Felaktig användare/lösenord";
                errorColor.a = 1;
                errorText.color = errorColor;
            }
        } else {
            errorText.text = "Användaren hittades inte";
            errorColor.a = 1;
            errorText.color = errorColor;
        }
    }
}
