using Godot;
using Rokojori;
using System.Collections.Generic;
 
namespace Rokojori
{ 
  [Tool]
  [GlobalClass,Icon("res://addons/rokojori_action_library/Icons/UIText.svg")]
  public partial class UIText:Label,UIStylePropertyContainer, iLocalizable
  {
    
    LocalizedString _locale;

    [Export]
    public LocalizedString locale
    {
      get => _locale;

      set { _locale = value; UpdateLocalization(); }
    }

    [Export]
    public bool refreshText 
    {
      get => false;
      set { if ( value ) UpdateLocalization(); UpdateFont(); }
    }

    [Export]
    public bool disableLocalization = false;

    public void UpdateLocalization()
    {
      if ( disableLocalization )
      {
        return;
      }

      Text = LocalizedString.Get( _locale );

    }

    
    [Export]
    public bool alwaysMinimumSize = true;

    UIStyle _parentStyle;
    [Export]
    public UIStyle parentStyle
    {
      get => _parentStyle;
      set { _parentStyle = value; UpdateFont(); }
    }

    Font _font;
    [ExportGroup( "Font" )]
    [Export]
    public Font font
    {
      get => _font;
      set { _font = value; UpdateFont(); }
    }

    [Export]
    public UINumber fontSize;
    [Export]
    public UIColor fontColor;

    [Export]
    public UINumber outlineSize;
    [Export]
    public UIColor outlineColor;

    [Export]
    public UINumber shadowSize;
    [Export]
    public UIColor shadowColor;

    [Export]
    public UINumber shadowOffsetX;
    [Export]
    public UINumber shadowOffsetY;

    [ExportGroup("Size & Margins")]
    [Export]
    public UINumber width;

    [Export]
    public UINumber height;


    [Export] 
    public UINumber margin;

    [Export] 
    public UINumber marginLeft;
    [Export] 
    public UINumber marginTop;
    [Export] 
    public UINumber marginRight;
    [Export] 
    public UINumber marginBottom;


    [ExportGroup( "Position" )]
    [Export]
    public UIPosition position;
    [Export]
    public UILineWrap lineWrap;
    [Export]
    public UINumber left;
    [Export]
    public UINumber top;
    [Export]
    public UINumber right;
    [Export]
    public UINumber bottom;

    
    [ExportGroup("Rotation & Scale")]
    [Export]
    public UINumber pivotX;
    [Export]
    public UINumber pivotY;

    [Export]
    public UINumber rotation;

    [Export]
    public UINumber scale;

    [Export]
    public UINumber scaleX;
    [Export]
    public UINumber scaleY;

    public Font GetFont()
    {
      return font;
    }

    void UpdateFont()
    {
      var resolvedFont = UIStyle.Font( this );

      if ( resolvedFont != null )
      {
        RemoveThemeFontOverride( "font" );
        AddThemeFontOverride( "font", resolvedFont );
      }

    }

    public List<ActiveStyleTransition<UIColor,ColorPropertyName>> GetActiveShaderUIColorTransitions()
    {
      return null;
    }
  
    public List<ActiveStyleTransition<UINumber,FloatPropertyName>> GetActiveShaderUINumberTransitions()
    {
      return null;
    }
    
    [ExportGroup("Transitions")]
    [Export]
    public TransitionSettingsAll transitionSettings;
    public TransitionSettingsAll GetTransitionSettingsAll()
    {
      return transitionSettings;
    }

    [Export]
    public UINumberTransition[] numberTransitions = new UINumberTransition[ 0 ];
    public UINumberTransition[] GetNumberTransitions()
    {
      return numberTransitions;
    }
    
    public List<ActiveStyleTransition<UINumber,UIStyleNumberProperty>> activeNumberTransitions = new List<ActiveStyleTransition<UINumber,UIStyleNumberProperty>>();
    public List<ActiveStyleTransition<UINumber,UIStyleNumberProperty>> GetActiveUINumberTransitions()
    {
      return activeNumberTransitions;
    }

    [Export]
    public UIColorTransition[] colorTransitions = new UIColorTransition[ 0 ];
    public UIColorTransition[] GetColorTransitions()
    {
      return colorTransitions;
    }
    
    public List<ActiveStyleTransition<UIColor,UIStyleColorProperty>> activeColorTransitions = new List<ActiveStyleTransition<UIColor,UIStyleColorProperty>>();
    public List<ActiveStyleTransition<UIColor,UIStyleColorProperty>> GetActiveUIColorTransitions()
    {
      return activeColorTransitions;
    }

    LabelSettings _labelSettings;



    public LabelSettings uiTextLabelSettings
    {
      get 
      {
        if ( _labelSettings == null )
        {
          _labelSettings = new LabelSettings();
        }

        LabelSettings = _labelSettings;
        return _labelSettings;
      }

      set 
      {
        _labelSettings = value.Duplicate() as LabelSettings;
        LabelSettings = _labelSettings;
      }
    }

    public UIStyle GetUIStyleParent()
    {
      return parentStyle;
    }

    public UIPosition GetUIPosition()
    {
      return position;
    }

    public UILineWrap GetUILineWrap()
    {
      return lineWrap;
    }

    public UILayout GetUILayout()
    {
      return UILayout.___;
    } 

    public ShaderUIColor[] GetShaderUIColors()
    {
      return null;
    }

    public ShaderUINumber[] GetShaderUINumbers()
    {
      return null;
    }

    

    public UINumber GetUIStyleNumberProperty( UIStyleNumberProperty property )
    {
      switch ( property )
      {
        case UIStyleNumberProperty.Width:  return width;
        case UIStyleNumberProperty.Height: return height;

        case UIStyleNumberProperty.Margin:       return margin;

        case UIStyleNumberProperty.MarginLeft:   return marginLeft;
        case UIStyleNumberProperty.MarginRight:  return marginRight;
        case UIStyleNumberProperty.MarginTop:    return marginTop;
        case UIStyleNumberProperty.MarginBottom: return marginBottom;


        case UIStyleNumberProperty.Left:   return left;
        case UIStyleNumberProperty.Right:  return right;
        case UIStyleNumberProperty.Top:    return top;
        case UIStyleNumberProperty.Bottom: return bottom;

        case UIStyleNumberProperty.PivotX:   return pivotX;
        case UIStyleNumberProperty.PivotY:   return pivotY;
        case UIStyleNumberProperty.Rotation: return rotation;

        case UIStyleNumberProperty.Scale:    return scale;
        case UIStyleNumberProperty.ScaleX:   return scaleX;
        case UIStyleNumberProperty.ScaleY:   return scaleY;

        case UIStyleNumberProperty.FontSize: return fontSize;
        case UIStyleNumberProperty.FontOutlineSize: return outlineSize;
        case UIStyleNumberProperty.FontShadowSize: return shadowSize;
        case UIStyleNumberProperty.FontShadowOffsetX: return shadowOffsetX;
        case UIStyleNumberProperty.FontShadowOffsetY: return shadowOffsetY;
      }

      return null;
    }

    public Vector2 GetUISize()
    {
      return GetSize();
    }

    public UIColor GetUIStyleColorProperty( UIStyleColorProperty property )
    {
      switch ( property )
      {
        case UIStyleColorProperty.FontColor:         return fontColor;
        case UIStyleColorProperty.FontOutlineColor:  return outlineColor;
        case UIStyleColorProperty.FontShadowColor:   return shadowColor;
      } 

      return null;
    }
  }
}