/*******************************************************************************
 * 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;

namespace OfficeOpenXml.Style;

/// <summary>
/// Cell style Font
/// </summary>
public sealed class ExcelFont : StyleBase {
  internal ExcelFont(ExcelStyles styles, int positionId, string address, int index)
      : base(styles, positionId, address) {
    Index = index;
  }

  /// <summary>
  /// The name of the font
  /// </summary>
  public string Name => _styles.Fonts[Index].Name;

  /// <summary>
  /// The Size of the font
  /// </summary>
  public float Size => _styles.Fonts[Index].Size;

  /// <summary>
  /// Font family
  /// </summary>
  public int Family => _styles.Fonts[Index].Family;

  /// <summary>
  /// Cell color
  /// </summary>
  public ExcelColor Color => new(_styles, _positionID, _address, eStyleClass.Font, this);

  /// <summary>
  /// Scheme
  /// </summary>
  public string Scheme => _styles.Fonts[Index].Scheme;

  /// <summary>
  /// Font-bold
  /// </summary>
  public bool Bold => _styles.Fonts[Index].Bold;

  /// <summary>
  /// Font-italic
  /// </summary>
  public bool Italic => _styles.Fonts[Index].Italic;

  /// <summary>
  /// Font-Strikeout
  /// </summary>
  public bool Strike => _styles.Fonts[Index].Strike;

  /// <summary>
  /// Font-Underline
  /// </summary>
  public bool UnderLine => _styles.Fonts[Index].UnderLine;

  public ExcelUnderLineType UnderLineType => _styles.Fonts[Index].UnderLineType;

  /// <summary>
  /// Font-Vertical Align
  /// </summary>
  public ExcelVerticalAlignmentFont VerticalAlign =>
    Enum.TryParse<ExcelVerticalAlignmentFont>(
        _styles.Fonts[Index].VerticalAlign,
        true,
        out var result)
        ? result
        : ExcelVerticalAlignmentFont.None;

  internal override string Id =>
    Name
        + Size
        + Family
        + Scheme
        + Bold.ToString()[0]
        + Italic.ToString()[0]
        + Strike.ToString()[0]
        + UnderLine.ToString()[0]
        + VerticalAlign;
}
