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

using System.Xml;
using OfficeOpenXml.Style;

namespace OfficeOpenXml;

/// <summary>
/// Represents one or more columns within the worksheet
/// </summary>
public class ExcelColumn : IRangeId {
  private readonly ExcelWorksheet _worksheet;
  private readonly XmlElement _colElement = null;

  /// <summary>
  /// Creates a new instance of the ExcelColumn class.
  /// For internal use only!
  /// </summary>
  /// <param name="worksheet"></param>
  /// <param name="col"></param>
  protected internal ExcelColumn(ExcelWorksheet worksheet, int col) {
    _worksheet = worksheet;
    _columnMin = col;
    _columnMax = col;
    _width = _worksheet.DefaultColWidth;
  }

  internal int _columnMin;

  /// <summary>
  /// Sets the first column the definition refers to.
  /// </summary>
  public int ColumnMin => _columnMin;

  //set { _columnMin=value; }
  internal int _columnMax;

  /// <summary>
  /// Sets the last column the definition refers to.
  /// </summary>
  public int ColumnMax {
    get => _columnMax;
    set {
      if (value < _columnMin && value > ExcelPackage.MaxColumns) {
        throw new("ColumnMax out of range");
      }

      var cse = new CellsStoreEnumerator<object>(
          _worksheet._values,
          0,
          0,
          0,
          ExcelPackage.MaxColumns);
      while (cse.Next()) {
        var c = cse.Value as ExcelColumn;
        if (cse.Column > _columnMin && c.ColumnMax <= value && cse.Column != _columnMin) {
          throw new(string.Format("ColumnMax can not span over existing column {0}.", c.ColumnMin));
        }
      }
      _columnMax = value;
    }
  }

  /// <summary>
  /// Internal range id for the column
  /// </summary>
  internal ulong ColumnID => GetColumnId(_worksheet.SheetID, ColumnMin);

  /// <summary>
  /// Allows the column to be hidden in the worksheet
  /// </summary>
  internal bool _hidden;
  public bool Hidden {
    get => _hidden;
    set => _hidden = value;
  }

  internal double VisualWidth {
    get {
      if (_hidden || (Collapsed && OutlineLevel > 0)) {
        return 0;
      }
      return _width;
    }
  }
  internal double _width;

  /// <summary>
  /// Sets the width of the column in the worksheet
  /// </summary>
  public double Width {
    get => _width;
    set {
      _width = value;

      if (_hidden && value != 0) {
        _hidden = false;
      }
    }
  }

  /// <summary>
  /// If set to true a column automaticlly resize(grow wider) when a user inputs numbers in a cell.
  /// </summary>
  public bool BestFit { get; set; }

  /// <summary>
  /// If the column is collapsed in outline mode
  /// </summary>
  public bool Collapsed { get; set; }

  /// <summary>
  /// Outline level. Zero if no outline
  /// </summary>
  public int OutlineLevel { get; set; }

  /// <summary>
  /// Phonetic
  /// </summary>
  public bool Phonetic { get; set; }

  /// <summary>
  /// The Style applied to the whole column. Only effects cells with no individual style set.
  /// Use Range object if you want to set specific styles.
  /// </summary>
  public ExcelStyle Style {
    get {
      string letter = ExcelCellBase.GetColumnLetter(ColumnMin);
      string endLetter = ExcelCellBase.GetColumnLetter(ColumnMax);
      return _worksheet.Workbook.Styles.GetStyleObject(
          StyleID,
          _worksheet.PositionID,
          letter + ":" + endLetter);
    }
  }
  internal string _styleName = "";

  /// <summary>
  /// Sets the style for the entire column using a style name.
  /// </summary>
  public string StyleName {
    get => _styleName;
    set {
      StyleID = _worksheet.Workbook.Styles.GetStyleIdFromName(value);
      _styleName = value;
    }
  }

  //internal int _styleID = 0;
  /// <summary>
  /// Sets the style for the entire column using the style ID.
  /// </summary>
  public int StyleID {
    get => _worksheet._styles.GetValue(0, ColumnMin);
    set => _worksheet._styles.SetValue(0, ColumnMin, value);
  }

  /// <summary>
  /// Adds a manual page break after the column.
  /// </summary>
  public bool PageBreak { get; set; }
  public bool Merged {
    get => _worksheet.MergedCells[ColumnMin, 0] != null;
    set => _worksheet.MergedCells.Add(new(1, ColumnMin, ExcelPackage.MaxRows, ColumnMax), true);
  }

  /// <summary>
  /// Returns the range of columns covered by the column definition.
  /// </summary>
  /// <returns>A string describing the range of columns covered by the column definition.</returns>
  public override string ToString() {
    return string.Format(
        "Column Range: {0} to {1}",
        _colElement.GetAttribute("min"),
        _colElement.GetAttribute("min"));
  }

  /// <summary>
  /// Get the internal RangeID
  /// </summary>
  /// <param name="sheetId">Sheet no</param>
  /// <param name="column">Column</param>
  /// <returns></returns>
  internal static ulong GetColumnId(int sheetId, int column) {
    return ((ulong)sheetId) + (((ulong)column) << 15);
  }

  ulong IRangeId.RangeID {
    get => ColumnID;
    set {
      int prevColMin = _columnMin;
      _columnMin = ((int)(value >> 15) & 0x3FF);
      _columnMax += prevColMin - ColumnMin;
      //Todo:More Validation
      if (_columnMax > ExcelPackage.MaxColumns) {
        _columnMax = ExcelPackage.MaxColumns;
      }
    }
  }

  /// <summary>
  /// Copies the current column to a new worksheet
  /// </summary>
  /// <param name="added">The worksheet where the copy will be created</param>
  internal ExcelColumn Clone(ExcelWorksheet added) {
    return Clone(added, ColumnMin);
  }

  internal ExcelColumn Clone(ExcelWorksheet added, int col) {
    ExcelColumn newCol = added.Column(col);
    newCol.ColumnMax = ColumnMax;
    newCol.BestFit = BestFit;
    newCol.Collapsed = Collapsed;
    newCol.OutlineLevel = OutlineLevel;
    newCol.PageBreak = PageBreak;
    newCol.Phonetic = Phonetic;
    newCol._styleName = _styleName;
    newCol.StyleID = StyleID;
    newCol.Width = Width;
    newCol.Hidden = Hidden;
    return newCol;
  }
}
