using System;
using System.Collections.Generic;
using System.Linq;
using Barotrauma;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Graphics;
namespace QICrabUI
{
  /// 
  /// Unfinished crap, don't use
  /// 
  public class CUIRadialMenuOption : CUIComponent
  {
    public GUISoundType ClickSound { get; set; } = GUISoundType.Select;
    public Color BaseColor
    {
      get => (Color)this.Animations["hover"].StartValue;
      set => this.Animations["hover"].StartValue = value;
    }
    public Color Hover
    {
      get => (Color)this.Animations["hover"].EndValue;
      set => this.Animations["hover"].EndValue = value;
    }
    public float TextRadius { get; set; } = 0.4f;
    public void SetRotation(float angle)
    {
      BackgroundSprite.Offset = new Vector2(0.5f, 0.5f);
      BackgroundSprite.Rotation = angle;
      this["Text"].Relative = new CUINullRect(
        (float)(TextRadius * Math.Cos(angle - Math.PI / 2)),
        (float)(TextRadius * Math.Sin(angle - Math.PI / 2))
      );
    }
    public Action Callback;
    public CUIRadialMenuOption(string name = "", Action callback = null)
    {
      IgnoreTransparent = true;
      Relative = new CUINullRect(0, 0, 1, 1);
      Callback = callback;
      OnMouseDown += (e) =>
      {
        SoundPlayer.PlayUISound(ClickSound);
        Callback?.Invoke();
      };
      this.Animations["hover"] = new CUIAnimation()
      {
        StartValue = new Color(255, 255, 255, 255),
        EndValue = new Color(0, 255, 255, 255),
        Property = "BackgroundColor",
        Duration = 0.2,
        ReverseDuration = 0.3,
      };
      this.Animations["hover"].ApplyValue();
      OnMouseEnter += (e) => Animations["hover"].Forward();
      OnMouseLeave += (e) => Animations["hover"].Back();
      this["Text"] = new CUITextBlock(name)
      {
        Anchor = CUIAnchor.Center,
        ZIndex = 100,
        TextScale = 1.0f,
      };
    }
  }
  /// 
  /// Unfinished crap, don't use
  /// 
  public class CUIRadialMenu : CUIComponent
  {
    public CUIRadialMenuOption OptionTemplate = new();
    public Dictionary Options = new();
    public CUIRadialMenuOption AddOption(string name, Action callback)
    {
      CUIRadialMenuOption option = new CUIRadialMenuOption(name, callback);
      option.ApplyState(OptionTemplate);
      option.Animations["hover"].Interpolate = OptionTemplate.Animations["hover"].Interpolate;
      option.Animations["hover"].ApplyValue();
      this[name] = Options[name] = option;
      option.OnClick += (e) => Close();
      CalculateRotations();
      return option;
    }
    public void CalculateRotations()
    {
      float delta = (float)(Math.PI * 2 / Options.Count);
      int i = 0;
      foreach (CUIRadialMenuOption option in Options.Values)
      {
        option.SetRotation(delta * i);
        i++;
      }
    }
    public bool IsOpened => Parent != null;
    public void Open(CUIComponent host = null)
    {
      host ??= CUI.Main;
      host.Append(this);
      Animations["fade"].SetToStart();
      Animations["fade"].Forward();
    }
    public void Close()
    {
      // BlockChildrenAnimations();
      // Animations["fade"].SetToEnd();
      // Animations["fade"].Back();
      RemoveSelf();
    }
    public CUIRadialMenu() : base()
    {
      Anchor = CUIAnchor.Center;
      Relative = new CUINullRect(h: 0.8f);
      CrossRelative = new CUINullRect(w: 0.8f);
      BackgroundColor = new Color(255, 255, 255, 255);
      //BackgroundSprite = new CUISprite("RadialMenu.png");
      Animations["fade"] = new CUIAnimation()
      {
        StartValue = 0.0f,
        EndValue = 1.0f,
        Property = "Transparency",
        Duration = 0.2,
        ReverseDuration = 0.1,
      };
      //HACK
      Animations["fade"].OnStop += (dir) =>
      {
        if (dir == CUIDirection.Reverse)
        {
          RemoveSelf();
        }
      };
    }
  }
}