using System;
using System.Globalization;

namespace OfficeOpenXml.Style.Dxf;

public abstract class DxfStyleBase<T> {
  protected ExcelStyles _styles;

  internal DxfStyleBase(ExcelStyles styles) {
    _styles = styles;
  }

  protected internal abstract string Id { get; }

  protected internal abstract bool HasValue { get; }

  protected internal abstract void CreateNodes(XmlHelper helper, string path);

  protected internal abstract T Clone();

  protected void SetValueColor(XmlHelper helper, string path, ExcelDxfColor color) {
    if (color != null && color.HasValue) {
      if (color.Rgb != null) {
        SetValue(helper, path + "/@rgb", color.Rgb);
      } else if (color.Auto != null) {
        SetValueBool(helper, path + "/@auto", color.Auto);
      } else if (color.Theme != null) {
        SetValue(helper, path + "/@theme", color.Theme);
      } else if (color.Index != null) {
        SetValue(helper, path + "/@indexed", color.Index);
      }
      if (color.Tint != null) {
        SetValue(helper, path + "/@tint", color.Tint);
      }
    }
  }

  /// <summary>
  /// Same as SetValue but will set first char to lower case.
  /// </summary>
  /// <param name="helper"></param>
  /// <param name="path"></param>
  /// <param name="v"></param>
  protected void SetValueEnum(XmlHelper helper, string path, Enum v) {
    if (v == null) {
      helper.DeleteNode(path);
    } else {
      var s = v.ToString();
      s = s.Substring(0, 1).ToLower(CultureInfo.InvariantCulture) + s.Substring(1);
      helper.SetXmlNodeString(path, s);
    }
  }

  protected void SetValue(XmlHelper helper, string path, object v) {
    if (v == null) {
      helper.DeleteNode(path);
    } else {
      helper.SetXmlNodeString(path, v.ToString());
    }
  }

  protected void SetValueBool(XmlHelper helper, string path, bool? v) {
    if (v == null) {
      helper.DeleteNode(path);
    } else {
      helper.SetXmlNodeBool(path, (bool)v);
    }
  }

  protected string GetAsString(object v) {
    return (v ?? "").ToString();
  }

  /// <summary>
  /// Is this value allowed to be changed?
  /// </summary>
  protected internal bool AllowChange { get; set; } = false;
}
