/*******************************************************************************
 * 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>
/// The background fill of a cell
/// </summary>
public class ExcelGradientFill : StyleBase {
  internal ExcelGradientFill(
      ExcelStyles styles,
      XmlHelper.ChangedEventHandler changedEvent,
      int positionId,
      string address,
      int index)
      : base(styles, changedEvent, positionId, address) {
    Index = index;
  }

  /// <summary>
  /// Angle of the linear gradient
  /// </summary>
  public double Degree => ((ExcelGradientFillXml)_styles.Fills[Index]).Degree;

  /// <summary>
  /// Linear or Path gradient
  /// </summary>
  public ExcelFillGradientType Type => ((ExcelGradientFillXml)_styles.Fills[Index]).Type;

  /// <summary>
  /// Specifies in percentage format(from the top to the bottom) the position of the top edge of the inner rectangle (color 1). For top, 0 means the top edge of the inner rectangle is on the top edge of the cell, and 1 means it is on the bottom edge of the cell. (applies to From Corner and From Center gradients).
  /// </summary>
  public double Top => ((ExcelGradientFillXml)_styles.Fills[Index]).Top;

  /// <summary>
  /// Specifies in percentage format (from the top to the bottom) the position of the bottom edge of the inner rectangle (color 1). For bottom, 0 means the bottom edge of the inner rectangle is on the top edge of the cell, and 1 means it is on the bottom edge of the cell.
  /// </summary>
  public double Bottom => ((ExcelGradientFillXml)_styles.Fills[Index]).Bottom;

  /// <summary>
  /// Specifies in percentage format (from the left to the right) the position of the left edge of the inner rectangle (color 1). For left, 0 means the left edge of the inner rectangle is on the left edge of the cell, and 1 means it is on the right edge of the cell. (applies to From Corner and From Center gradients).
  /// </summary>
  public double Left => ((ExcelGradientFillXml)_styles.Fills[Index]).Left;

  /// <summary>
  /// Specifies in percentage format (from the left to the right) the position of the right edge of the inner rectangle (color 1). For right, 0 means the right edge of the inner rectangle is on the left edge of the cell, and 1 means it is on the right edge of the cell. (applies to From Corner and From Center gradients).
  /// </summary>
  public double Right => ((ExcelGradientFillXml)_styles.Fills[Index]).Right;

  private ExcelColor _gradientColor1;

  /// <summary>
  /// Gradient Color 1
  /// </summary>
  public ExcelColor Color1 {
    get {
      if (_gradientColor1 == null) {
        _gradientColor1 = new(
            _styles,
            _ChangedEvent,
            _positionID,
            _address,
            eStyleClass.FillGradientColor1,
            this);
      }
      return _gradientColor1;
    }
  }

  private ExcelColor _gradientColor2;

  /// <summary>
  /// Gradient Color 2
  /// </summary>
  public ExcelColor Color2 {
    get {
      if (_gradientColor2 == null) {
        _gradientColor2 = new(
            _styles,
            _ChangedEvent,
            _positionID,
            _address,
            eStyleClass.FillGradientColor2,
            this);
      }
      return _gradientColor2;
    }
  }

  internal override string Id =>
    Degree.ToString() + Type + Color1.Id + Color2.Id + Top + Bottom + Left + Right;
}
