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

namespace AppsheetEpplus;

internal class RowInternal {
  internal double Height = -1;
  internal bool Hidden;
  internal bool Collapsed;
  internal short OutlineLevel;
  internal bool PageBreak;
  internal bool Phonetic;
  internal bool CustomHeight;
}

/// <summary>
/// Represents an individual row in the spreadsheet.
/// </summary>
public class ExcelRow : IRangeId {
  private readonly ExcelWorksheet _worksheet;
  private readonly XmlElement _rowElement = null;

  /// <summary>
  /// Internal RowID.
  /// </summary>
  [Obsolete]
  public ulong RowID => GetRowId(_worksheet.SheetID, Row);

  /// <summary>
  /// Creates a new instance of the ExcelRow class.
  /// For internal use only!
  /// </summary>
  /// <param name="worksheet">The parent worksheet</param>
  /// <param name="row">The row number</param>
  internal ExcelRow(ExcelWorksheet worksheet, int row) {
    _worksheet = worksheet;
    Row = row;
  }

  /// <summary>
  /// Provides access to the node representing the row.
  /// </summary>
  internal XmlNode Node => (_rowElement);

  /// <summary>
  /// Allows the row to be hidden in the worksheet
  /// </summary>
  public bool Hidden {
    get {
      var r = (RowInternal)_worksheet._values.GetValue(Row, 0);
      if (r == null) {
        return false;
      }
      return r.Hidden;
    }
    set {
      var r = GetRowInternal();
      r.Hidden = value;
    }
  }

  /// <summary>
  /// Sets the height of the row
  /// </summary>
  public double Height {
    get {
      var r = (RowInternal)_worksheet._values.GetValue(Row, 0);
      if (r == null || r.Height < 0) {
        return _worksheet.DefaultRowHeight;
      }
      return r.Height;
    }
    set {
      var r = GetRowInternal();
      r.Height = value;

      if (r.Hidden && value != 0) {
        Hidden = false;
      }
      r.CustomHeight = (value != _worksheet.DefaultRowHeight);
    }
  }

  /// <summary>
  /// Set to true if You don't want the row to Autosize
  /// </summary>
  public bool CustomHeight {
    get {
      var r = (RowInternal)_worksheet._values.GetValue(Row, 0);
      if (r == null) {
        return false;
      }
      return r.CustomHeight;
    }
    set {
      var r = GetRowInternal();
      r.CustomHeight = value;
    }
  }

  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;
    }
  }

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

  /// <summary>
  /// Rownumber
  /// </summary>
  public int Row { get; set; }

  /// <summary>
  /// If outline level is set this tells that the row is collapsed
  /// </summary>
  public bool Collapsed {
    get {
      var r = (RowInternal)_worksheet._values.GetValue(Row, 0);
      if (r == null) {
        return false;
      }
      return r.Collapsed;
    }
    set {
      var r = GetRowInternal();
      r.Collapsed = value;
    }
  }

  /// <summary>
  /// Outline level.
  /// </summary>
  public int OutlineLevel {
    get {
      var r = (RowInternal)_worksheet._values.GetValue(Row, 0);
      if (r == null) {
        return 0;
      }
      return r.OutlineLevel;
    }
    set {
      var r = GetRowInternal();
      r.OutlineLevel = (short)value;
    }
  }

  private RowInternal GetRowInternal() {
    var r = (RowInternal)_worksheet._values.GetValue(Row, 0);
    if (r == null) {
      r = new();
      _worksheet._values.SetValue(Row, 0, r);
    }
    return r;
  }

  /// <summary>
  /// Show phonetic Information
  /// </summary>
  public bool Phonetic {
    get {
      var r = (RowInternal)_worksheet._values.GetValue(Row, 0);
      if (r == null) {
        return false;
      }
      return r.Phonetic;
    }
    set {
      var r = GetRowInternal();
      r.Phonetic = value;
    }
  }

  /// <summary>
  /// The Style applied to the whole row. Only effekt cells with no individual style set.
  /// Use ExcelRange object if you want to set specific styles.
  /// </summary>
  public ExcelStyle Style =>
    _worksheet.Workbook.Styles.GetStyleObject(StyleID, _worksheet.PositionID, Row + ":" + Row);

  /// <summary>
  /// Adds a manual page break after the row.
  /// </summary>
  public bool PageBreak {
    get {
      var r = (RowInternal)_worksheet._values.GetValue(Row, 0);
      if (r == null) {
        return false;
      }
      return r.PageBreak;
    }
    set {
      var r = GetRowInternal();
      r.PageBreak = value;
    }
  }

  public bool Merged {
    get => _worksheet.MergedCells[Row, 0] != null;
    set => _worksheet.MergedCells.Add(new(Row, 1, Row, ExcelPackage.MaxColumns), true);
  }

  internal static ulong GetRowId(int sheetId, int row) {
    return ((ulong)sheetId) + (((ulong)row) << 29);
  }

  [Obsolete]
  ulong IRangeId.RangeID {
    get => RowID;
    set => Row = ((int)(value >> 29));
  }
}
