using System;
using System.Collections.Generic;

using UnityEditor.IMGUI.Controls;
using UnityEngine;

using Codice.Client.Common;
using Codice.CM.Common;
using PlasticGui;
using Unity.PlasticSCM.Editor.CloudDrive.CreateWorkspace;
using Unity.PlasticSCM.Editor.UI;
using Unity.PlasticSCM.Editor.UI.Tree;

namespace Unity.PlasticSCM.Editor.CloudDrive.ShareWorkspace
{
    internal class ShareWorkspacePanel
    {
        internal ShareWorkspacePanel(
            WorkspaceInfo wkInfo,
            IProgressControls progressControls,
            Action repaintAction)
        {
            BuildComponents(wkInfo, progressControls, repaintAction);
        }

        internal List<SecurityMember> GetCollaboratorsToAdd()
        {
            return mCollaboratorsListView.GetCollaboratorsToAdd();
        }

        internal List<SecurityMember> GetCollaboratorsToRemove()
        {
            return mCollaboratorsListView.GetCollaboratorsToRemove();
        }

        internal void Refresh(string organization, string project)
        {
            mOrganization = organization;
            mProject = project;

            mCollaboratorsListView.Refresh(
                organization,
                GetProjectGuid.ForProject(project, organization));
        }

        internal void OnGUI(bool isOperationRunning)
        {
            GUILayout.Label(
                PlasticLocalization.Name.ShareDriveTitle.GetString(),
                UnityStyles.Dialog.Title);

            GUILayout.Space(5);

            GUILayout.Label(
                PlasticLocalization.Name.ShareDriveExplanation.GetString(),
                UnityStyles.Paragraph);

            GUILayout.Space(10);

            DrawFilterCollaboratorsArea();

            GUILayout.Space(10);

            Rect treeRect = GUILayoutUtility.GetRect(
                0,
                0,
                GUILayout.MaxWidth(LAYOUT_MAX_WIDTH),
                GUILayout.MaxHeight(350));
            mCollaboratorsListView.OnGUI(treeRect);

            GUILayout.Space(5);

            DrawManageUsersLink(isOperationRunning);

            GUILayout.Space(5);
        }

        void DrawFilterCollaboratorsArea()
        {
            GUILayout.BeginHorizontal(GUILayout.MaxWidth(LAYOUT_MAX_WIDTH));
            GUILayout.FlexibleSpace();

            DrawSearchField.For(
                mSearchField,
                mCollaboratorsListView,
                UnityConstants.SEARCH_FIELD_WIDTH);

            GUILayout.EndHorizontal();
        }

        void DrawManageUsersLink(bool isOperationRunning)
        {
            GUILayout.BeginHorizontal();

            using (new GuiEnabled(!isOperationRunning))
            {
                GUIContent buttonContent = new GUIContent(
                    PlasticLocalization.Name.ManageUsersDashboardLink.GetString());

                Rect rect = GUILayoutUtility.GetRect(
                    buttonContent, UnityStyles.LinkLabel,
                    GUILayout.MinWidth(ENTRY_WIDTH),
                    GUILayout.MaxWidth(ENTRY_WIDTH));

                if (GUI.Button(rect, buttonContent, UnityStyles.LinkLabel))
                {
                    OpenManageUsersUrl(mOrganization, mProject);
                }
            }

            GUILayout.FlexibleSpace();
            GUILayout.EndHorizontal();
        }

        static void OpenManageUsersUrl(
            string selectedOrganization,
            string selectedProject)
        {
            string solvedServer = ResolveServer.FromUserInput(
                selectedOrganization, CmConnection.Get().UnityOrgResolver);

            if (!CloudServer.IsUnityOrganization(selectedOrganization))
            {
                Application.OpenURL(
                    UnityUrl.UnityDashboard.Plastic.GetForManageUsersLegacyOrg(
                        CloudServer.GetOrganizationName(selectedOrganization)));
                return;
            }

            string genesisOrgId;
            if (!CloudServer.TryGetGenesisOrgId(solvedServer, out genesisOrgId))
                return;

            Application.OpenURL(
                UnityUrl.UnityDashboard.UnityOrganizations.GetManageMembersUrl(
                    genesisOrgId,
                    GetProjectGuid.ForProject(selectedProject, selectedOrganization)));
        }

        void BuildComponents(
            WorkspaceInfo wkInfo,
            IProgressControls progressControls,
            Action repaintAction)
        {
            CollaboratorsListViewHeaderState collaboratorsListHeaderState =
                CollaboratorsListViewHeaderState.GetDefault();

            TreeHeaderSettings.Load(
                collaboratorsListHeaderState,
                UnityConstants.CloudDrive.COLLABORATORS_TABLE_SETTINGS_NAME,
                (int)CollaboratorsListColumn.User,
                true);

            mSearchField = new SearchField();
            mCollaboratorsListView = new CollaboratorsListView(
                wkInfo, progressControls, collaboratorsListHeaderState, repaintAction);
            mCollaboratorsListView.Reload();
        }

        string mOrganization;
        string mProject;

        SearchField mSearchField;
        CollaboratorsListView mCollaboratorsListView;

        const float ENTRY_WIDTH = 400;
        const float LAYOUT_MAX_WIDTH = 800;
    }
}