/*******************************************************************************
 * 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;
using System.Xml;
using OfficeOpenXml.Style;

namespace OfficeOpenXml;

/// <summary>
/// Represents one or more columns within the worksheet
/// </summary>
public class ExcelColumn : IRangeId {
  private ExcelWorksheet _worksheet;
  private 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;
  }
}
