/*******************************************************************************
 * You may amend and distribute as you like, but don't remove this header!
 *
 * EPPlus provides server-side generation of Excel 2007/2010 spreadsheets.
 * See http://www.codeplex.com/EPPlus for details.
 *
 * Copyright (C) 2011  Jan Källman
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.

 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Lesser General Public License for more details.
 *
 * The GNU Lesser General Public License can be viewed at http://www.opensource.org/licenses/lgpl-license.php
 * If you unfamiliar with this license or have questions about it, here is an http://www.gnu.org/licenses/gpl-faq.html
 *
 * All code and executables are provided "as is" with no warranty either express or implied.
 * The author accepts no liability for any damage or loss of business that this product may cause.
 *
 * Code change notes:
 *
 * Author							Change						Date
 * ******************************************************************************
 * Jan Källman		                Initial Release		        2009-10-01
 * Jan Källman		License changed GPL-->LGPL 2011-12-16
 *******************************************************************************/

using System;
using OfficeOpenXml.Style.XmlAccess;

namespace OfficeOpenXml.Style;

/// <summary>
/// Color for cellstyling
/// </summary>
public sealed class ExcelColor : StyleBase {
  private readonly eStyleClass _cls;
  private readonly StyleBase _parent;

  internal ExcelColor(
      ExcelStyles styles,
      XmlHelper.ChangedEventHandler changedEvent,
      int worksheetId,
      string address,
      eStyleClass cls,
      StyleBase parent)
      : base(styles, changedEvent, worksheetId, address) {
    _parent = parent;
    _cls = cls;
  }

  /// <summary>
  /// The theme color
  /// </summary>
  public string Theme => GetSource().Theme;

  /// <summary>
  /// The tint value
  /// </summary>
  public decimal Tint => GetSource().Tint;

  /// <summary>
  /// The RGB value
  /// </summary>
  public string Rgb => GetSource().Rgb;

  /// <summary>
  /// The indexed color number.
  /// </summary>
  public int Indexed => GetSource().Indexed;

  internal override string Id => Theme + Tint + Rgb + Indexed;

  private ExcelColorXml GetSource() {
    Index = _parent.Index < 0 ? 0 : _parent.Index;
    switch (_cls) {
      case eStyleClass.FillBackgroundColor:
        return _styles.Fills[Index].BackgroundColor;
      case eStyleClass.FillPatternColor:
        return _styles.Fills[Index].PatternColor;
      case eStyleClass.Font:
        return _styles.Fonts[Index].Color;
      case eStyleClass.BorderLeft:
        return _styles.Borders[Index].Left.Color;
      case eStyleClass.BorderTop:
        return _styles.Borders[Index].Top.Color;
      case eStyleClass.BorderRight:
        return _styles.Borders[Index].Right.Color;
      case eStyleClass.BorderBottom:
        return _styles.Borders[Index].Bottom.Color;
      case eStyleClass.BorderDiagonal:
        return _styles.Borders[Index].Diagonal.Color;
      default:
        throw (new("Invalid style-class for Color"));
    }
  }

  internal override void SetIndex(int index) {
    _parent.Index = index;
  }

  /// <summary>
  /// Return the RGB value for the color object that uses the Indexed or Tint property
  /// </summary>
  /// <param name="theColor">The color object</param>
  /// <returns>The RGB color starting with a #</returns>
  public string LookupColor(ExcelColor theColor) {
    //Thanks to neaves for contributing this method.
    int iTint = 0;
    string translatedRgb = "";

    // reference extracted from ECMA-376, Part 4, Section 3.8.26
    string[] rgbLookup = {
      "#FF000000", // 0
      "#FFFFFFFF",
      "#FFFF0000",
      "#FF00FF00",
      "#FF0000FF",
      "#FFFFFF00",
      "#FFFF00FF",
      "#FF00FFFF",
      "#FF000000", // 8
      "#FFFFFFFF",
      "#FFFF0000",
      "#FF00FF00",
      "#FF0000FF",
      "#FFFFFF00",
      "#FFFF00FF",
      "#FF00FFFF",
      "#FF800000",
      "#FF008000",
      "#FF000080",
      "#FF808000",
      "#FF800080",
      "#FF008080",
      "#FFC0C0C0",
      "#FF808080",
      "#FF9999FF",
      "#FF993366",
      "#FFFFFFCC",
      "#FFCCFFFF",
      "#FF660066",
      "#FFFF8080",
      "#FF0066CC",
      "#FFCCCCFF",
      "#FF000080",
      "#FFFF00FF",
      "#FFFFFF00",
      "#FF00FFFF",
      "#FF800080",
      "#FF800000",
      "#FF008080",
      "#FF0000FF",
      "#FF00CCFF",
      "#FFCCFFFF",
      "#FFCCFFCC",
      "#FFFFFF99",
      "#FF99CCFF",
      "#FFFF99CC",
      "#FFCC99FF",
      "#FFFFCC99",
      "#FF3366FF",
      "#FF33CCCC",
      "#FF99CC00",
      "#FFFFCC00",
      "#FFFF9900",
      "#FFFF6600",
      "#FF666699",
      "#FF969696",
      "#FF003366",
      "#FF339966",
      "#FF003300",
      "#FF333300",
      "#FF993300",
      "#FF993366",
      "#FF333399",
      "#FF333333", // 63
    };

    if ((0 <= theColor.Indexed) && (rgbLookup.Length > theColor.Indexed)) {
      // coloring by pre-set color codes
      translatedRgb = rgbLookup[theColor.Indexed];
    } else if (null != theColor.Rgb && 0 < theColor.Rgb.Length) {
      // coloring by RGB value ("FFRRGGBB")
      translatedRgb = "#" + theColor.Rgb;
    } else {
      // coloring by shades of grey (-1 -> 0)
      iTint = ((int)(theColor.Tint * 160) + 0x80);
      translatedRgb = ((int)(decimal.Round(theColor.Tint * -512))).ToString("X");
      translatedRgb = "#FF" + translatedRgb + translatedRgb + translatedRgb;
    }

    return translatedRgb;
  }
}
