using Unity.PlasticSCM.Editor.Views.BranchExplorer.Drawing.Shapes;
using System.Collections.Generic;
using Codice.Client.BaseCommands.BranchExplorer;

namespace Unity.PlasticSCM.Editor.Views.BranchExplorer
{
    internal static class FindReferenceChangeset
    {
        internal static ChangesetDrawInfo FromChangesetShapes(List<ChangesetShape> shapes)
        {
            BrExRectangle mostRightChangesetBounds = new BrExRectangle();
            ChangesetDrawInfo mostRightChangeset = null;

            foreach (ChangesetShape changesetShape in shapes)
            {
                if (changesetShape.ChangesetDraw.IsWorkspaceChangeset)
                    return changesetShape.ChangesetDraw;

                if (changesetShape.IsSelected)
                    return GetRelevantSelfOrParent(changesetShape.ChangesetDraw);

                if (changesetShape.ChangesetDraw.Bounds.X <= mostRightChangesetBounds.X)
                    continue;

                mostRightChangesetBounds = changesetShape.ChangesetDraw.Bounds;
                mostRightChangeset = changesetShape.ChangesetDraw;
            }

            return mostRightChangeset;
        }

        static ChangesetDrawInfo GetRelevantSelfOrParent(ChangesetDrawInfo changesetDrawInfo)
        {
            ChangesetDrawInfo current = changesetDrawInfo;

            while (current != null && !IsRelevant(current))
            {
                current = GetParentOrRelevantParent(current);
            }

            return current;
        }

        static ChangesetDrawInfo GetParentOrRelevantParent(ChangesetDrawInfo changesetDrawInfo)
        {
            if (changesetDrawInfo.Parent != null)
                return changesetDrawInfo.Parent;

            if (changesetDrawInfo.RelevantParent != null)
                return changesetDrawInfo.RelevantParent;

            return null;
        }

        static bool IsRelevant(ChangesetDrawInfo changesetDrawInfo)
        {
            return ((BrExChangeset)changesetDrawInfo.Tag).IsRelevant;
        }
    }
}