using Codice.Client.Common.WebApi;
using Codice.CM.Common;
using Unity.PlasticSCM.Editor.AssetUtils;

namespace Unity.PlasticSCM.Editor.Hub.Operations
{
    internal class OperationParams
    {
        internal readonly string WorkspaceFullPath;
        internal readonly string Organization;
        internal readonly string Repository;
        internal readonly RepositorySpec RepositorySpec;
        internal readonly string AccessToken;

        internal static OperationParams BuildFromCommand(
            ParseArguments.Command command,
            string unityAccessToken)
        {
            string workspaceFullPath = command.HasWorkspacePath() ?
                AssetsPath.GetFullPath.ForPath(command.WorkspacePath) :
                AssetsPath.GetFullPath.ForPath(command.ProjectPath);

            return new OperationParams(
                workspaceFullPath,
                command.Organization,
                command.Repository,
                BuildRepositorySpec(
                    command.Organization, command.Repository),
                unityAccessToken);
        }

        static RepositorySpec BuildRepositorySpec(
            string organization,
            string repository)
        {
            string defaultCloudAlias = new PlasticWebRestApi()
                .GetDefaultCloudAlias();

            return RepositorySpec.BuildFromNameAndResolvedServer(
                repository,
                CloudServer.BuildFullyQualifiedName(organization, defaultCloudAlias)
            );
        }

        OperationParams(
            string workspaceFullPath,
            string organization,
            string repository,
            RepositorySpec repositorySpec,
            string accessToken)
        {
            WorkspaceFullPath = workspaceFullPath;
            Organization = organization;
            Repository = repository;
            RepositorySpec = repositorySpec;
            AccessToken = accessToken;
        }
    }
}