using System;
using System.Diagnostics;
using System.Linq;
using UnityEditor;
using UnityEngine;

namespace Unity.VisualScripting
{
    public class AcknowledgementPage : Page
    {
        public AcknowledgementPage(PluginAcknowledgement acknowledgement)
        {
            this.acknowledgement = acknowledgement;
            title = shortTitle = acknowledgement.title;
            icon = BoltCore.Resources.LoadIcon("AcknowledgementPage.png");

            // Remove single newlines but keep multiple newlines.
            licenseText = acknowledgement.licenseText == null ? null : string.Join("\n\n", acknowledgement.licenseText.Split(new[] { "\r\n\r\n", "\n\n" }, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Replace("\r\n", "").Replace("\n", "")).ToArray());
        }

        private readonly PluginAcknowledgement acknowledgement;
        private readonly string licenseText;

        private Vector2 licenseScroll;

        protected override void OnContentGUI()
        {
            GUILayout.BeginVertical(Styles.background);

            GUILayout.Label(acknowledgement.title, Styles.title);

            var hasAuthor = !StringUtility.IsNullOrWhiteSpace(acknowledgement.author);
            var hasCopyright = acknowledgement.copyrightYear != null;

            if (hasAuthor && hasCopyright)
            {
                GUILayout.Label($"Copyright \u00a9 {acknowledgement.copyrightYear} {acknowledgement.author}", Styles.property);
            }
            else if (hasAuthor)
            {
                GUILayout.Label($"Author: {acknowledgement.author}", Styles.property);
            }
            else if (hasCopyright)
            {
                GUILayout.Label($"Copyright \u00a9 {acknowledgement.copyrightYear}", Styles.property);
            }

            if (!StringUtility.IsNullOrWhiteSpace(acknowledgement.url))
            {
                if (GUILayout.Button(acknowledgement.url, Styles.url))
                {
                    Process.Start(acknowledgement.url);
                }
            }

            if (!StringUtility.IsNullOrWhiteSpace(acknowledgement.licenseName))
            {
                GUILayout.Label("License: " + acknowledgement.licenseName.Trim(), Styles.property);
            }

            LudiqGUI.EndVertical();

            if (!StringUtility.IsNullOrWhiteSpace(acknowledgement.licenseText))
            {
                GUILayout.Box(GUIContent.none, LudiqStyles.horizontalSeparator);

                licenseScroll = GUILayout.BeginScrollView(licenseScroll, Styles.licenseBackground);

                GUILayout.Label(licenseText, Styles.licenseText);

                GUILayout.EndScrollView();

                LudiqGUI.Space(-1);
            }
        }

        public static class Styles
        {
            static Styles()
            {
                title = new GUIStyle(EditorStyles.largeLabel);
                title.margin = new RectOffset(0, 0, 0, 0);
                title.fontSize = 15;
                title.margin.bottom = 4;

                property = new GUIStyle(EditorStyles.label);
                property.wordWrap = true;

                background = new GUIStyle(LudiqStyles.windowBackground);
                background.padding = new RectOffset(10, 10, 10, 10);

                url = new GUIStyle(property);
                url.normal.textColor = ColorPalette.hyperlink;
                url.active.textColor = ColorPalette.hyperlinkActive;
                url.wordWrap = true;

                licenseBackground = new GUIStyle(LudiqStyles.windowBackground);
                licenseBackground.margin = new RectOffset(0, 0, 0, 0);
                licenseBackground.padding = new RectOffset(10, 10, 10, 10);

                licenseText = new GUIStyle(EditorStyles.label);
                licenseText.font = Font.CreateDynamicFontFromOSFont(new[] { "Courier", "Courier New" }, 12);
                licenseText.wordWrap = true;
                licenseText.fontSize = 12;
            }

            public static readonly GUIStyle title;
            public static readonly GUIStyle property;
            public static readonly GUIStyle url;
            public static readonly GUIStyle background;
            public static readonly GUIStyle licenseBackground;
            public static readonly GUIStyle licenseText;
        }
    }
}