using System.Diagnostics.CodeAnalysis;
using System.Threading.Tasks;
using Pixiview.iOS.Renderers;
using Pixiview.iOS.Renderers.AppShellSection;
using Pixiview.Utils;
using UIKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

[assembly: ExportRenderer(typeof(Shell), typeof(AppShellRenderer))]
namespace Pixiview.iOS.Renderers
{
    public class AppShellRenderer : ShellRenderer
    {
        public override bool PrefersHomeIndicatorAutoHidden => Screen.GetHomeIndicatorAutoHidden(Element);

        protected override IShellSectionRenderer CreateShellSectionRenderer(ShellSection shellSection)
        {
            var renderer = base.CreateShellSectionRenderer(shellSection);   // new AppShellSectionRenderer(this);
            if (renderer is ShellSectionRenderer sr && Element is AppShell shell)
            {
                shell.SetNavigationBarHeight(sr.NavigationBar.Frame.Height);
                shell.SetStatusBarHeight(UIApplication.SharedApplication.StatusBarFrame.Height);
            }
            return renderer;
        }

        protected override IShellItemTransition CreateShellItemTransition()
        {
            return new AppShellItemTransition();
        }

        protected override IShellTabBarAppearanceTracker CreateTabBarAppearanceTracker()
        {
            return new AppShellTabBarAppearanceTracker();
        }

        protected override IShellNavBarAppearanceTracker CreateNavBarAppearanceTracker()
        {
            return new AppShellNavBarAppearanceTracker();
        }

        protected override void UpdateBackgroundColor()
        {
            NativeView.BackgroundColor = Color.Transparent.ToUIColor();
        }
    }

    public class AppShellItemTransition : IShellItemTransition
    {
        [SuppressMessage("Code Notifications", "XI0001:Notifies you with advices on how to use Apple APIs", Justification = "<Pending>")]
        public Task Transition(IShellItemRenderer oldRenderer, IShellItemRenderer newRenderer)
        {
            var task = new TaskCompletionSource<bool>();
            var oldView = oldRenderer.ViewController.View;
            var newView = newRenderer.ViewController.View;
            newView.Alpha = 0;

            newView.Superview.InsertSubviewAbove(newView, oldView);

            UIView.Animate(0.2, 0, UIViewAnimationOptions.BeginFromCurrentState, () => newView.Alpha = 1, () => task.TrySetResult(true));

            return task.Task;
        }
    }

    public class AppShellSectionRenderer : ShellSectionRenderer
    {
        public AppShellSectionRenderer(IShellContext context) : base(context)
        {
        }

        protected override IShellSectionRootRenderer CreateShellSectionRootRenderer(ShellSection shellSection, IShellContext shellContext)
        {
            return new AppShellSectionRootRenderer(shellSection, shellContext);
        }
    }

    public class AppShellSectionRootRenderer : ShellSectionRootRenderer
    {
        public AppShellSectionRootRenderer(ShellSection shellSection, IShellContext shellContext) : base(shellSection, shellContext)
        {
        }

        protected override IShellSectionRootHeader CreateShellSectionRootHeader(IShellContext shellContext)
        {
            return new AppShellSectionRootHeader(shellContext);
        }
    }
}
