using UnityEngine;

using Codice.CM.Common;
using PlasticGui.Gluon;
using PlasticGui.Gluon.WorkspaceWindow;
using Unity.PlasticSCM.Editor.Topbar;
using Unity.PlasticSCM.Editor.UI;

namespace Unity.PlasticSCM.Editor.Gluon
{
    internal class IncomingChangesNotification : NotificationsArea.IIncomingChangesNotification
    {
        internal IncomingChangesNotification(
            WorkspaceInfo wkInfo,
            IGluonViewSwitcher gluonViewSwitcher)
        {
            mWkInfo = wkInfo;
            mGluonViewSwitcher = gluonViewSwitcher;
        }

        bool NotificationsArea.IIncomingChangesNotification.HasNotification
        {
            get { return mHasNotification; }
        }

        void NotificationsArea.IIncomingChangesNotification.OnGUI()
        {
            Texture2D icon = mData.Status == UVCSNotificationStatus.IncomingChangesStatus.Conflicts ?
                Images.GetConflictedIcon() :
                Images.GetOutOfSyncIcon();

            NotificationsArea.DrawIcon(
                icon,
                UnityConstants.INCOMING_CHANGES_NOTIFICATION_ICON_SIZE);

            NotificationsArea.DrawNotification(new GUIContentNotification(
                new GUIContent(mData.InfoText)));

            GUILayout.Space(3);

            if (NotificationsArea.DrawButton(new GUIContent(mData.ActionText, mData.TooltipText)))
            {
                ShowIncomingChanges.FromNotificationBar(mWkInfo, mGluonViewSwitcher);
            }
        }

        void NotificationsArea.IIncomingChangesNotification.Show(
            string infoText,
            string actionText,
            string tooltipText,
            bool hasUpdateAction,
            UVCSNotificationStatus.IncomingChangesStatus status)
        {
            mData.UpdateData(
                infoText,
                actionText,
                tooltipText,
                hasUpdateAction,
                status);

            mHasNotification = true;
        }

        void NotificationsArea.IIncomingChangesNotification.Hide()
        {
            mData.Clear();

            mHasNotification = false;
        }

        bool mHasNotification;
        NotificationsArea.IncomingChangesNotificationData mData = new NotificationsArea.IncomingChangesNotificationData();

        readonly IGluonViewSwitcher mGluonViewSwitcher;
        readonly WorkspaceInfo mWkInfo;
    }
}