/*******************************************************************************
 * 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		        2010-03-14
 * Jan Källman		    License changed GPL-->LGPL 2011-12-27
 *******************************************************************************/

using System.Collections.Immutable;
using System.Xml;

namespace OfficeOpenXml;

/// <summary>
/// Sheet protection
///<seealso cref="ExcelEncryption"/>
///<seealso cref="ExcelProtection"/>
/// </summary>
public sealed class ExcelSheetProtection : XmlHelper {
  protected override ImmutableArray<string> SchemaNodeOrder =>
    ExcelWorksheet.WorksheetSchemaNodeOrder;

  internal ExcelSheetProtection(XmlNamespaceManager nsm, XmlNode topNode)
      : base(nsm, topNode) {}

  private const string _isProtectedPath = "d:sheetProtection/@sheet";

  /// <summary>
  /// If the worksheet is protected.
  /// </summary>
  public bool IsProtected {
    get => GetXmlNodeBool(_isProtectedPath, false);
    set {
      SetXmlNodeBool(_isProtectedPath, value, false);
      if (value) {
        AllowEditObject = true;
        AllowEditScenarios = true;
      } else {
        DeleteAllNode(_isProtectedPath); //delete the whole sheetprotection node
      }
    }
  }

  private const string _allowSelectLockedCellsPath = "d:sheetProtection/@selectLockedCells";

  /// <summary>
  /// Allow users to select locked cells
  /// </summary>
  public bool AllowSelectLockedCells {
    get => !GetXmlNodeBool(_allowSelectLockedCellsPath, false);
    set => SetXmlNodeBool(_allowSelectLockedCellsPath, !value, false);
  }

  private const string _allowSelectUnlockedCellsPath = "d:sheetProtection/@selectUnlockedCells";

  /// <summary>
  /// Allow users to select unlocked cells
  /// </summary>
  public bool AllowSelectUnlockedCells {
    get => !GetXmlNodeBool(_allowSelectUnlockedCellsPath, false);
    set => SetXmlNodeBool(_allowSelectUnlockedCellsPath, !value, false);
  }

  private const string _allowObjectPath = "d:sheetProtection/@objects";

  /// <summary>
  /// Allow users to edit objects
  /// </summary>
  public bool AllowEditObject {
    get => !GetXmlNodeBool(_allowObjectPath, false);
    set => SetXmlNodeBool(_allowObjectPath, !value, false);
  }

  private const string _allowScenariosPath = "d:sheetProtection/@scenarios";

  /// <summary>
  /// Allow users to edit senarios
  /// </summary>
  public bool AllowEditScenarios {
    get => !GetXmlNodeBool(_allowScenariosPath, false);
    set => SetXmlNodeBool(_allowScenariosPath, !value, false);
  }

  private const string _allowFormatCellsPath = "d:sheetProtection/@formatCells";

  /// <summary>
  /// Allow users to format cells
  /// </summary>
  public bool AllowFormatCells {
    get => !GetXmlNodeBool(_allowFormatCellsPath, true);
    set => SetXmlNodeBool(_allowFormatCellsPath, !value, true);
  }

  private const string _allowFormatColumnsPath = "d:sheetProtection/@formatColumns";

  /// <summary>
  /// Allow users to Format columns
  /// </summary>
  public bool AllowFormatColumns {
    get => !GetXmlNodeBool(_allowFormatColumnsPath, true);
    set => SetXmlNodeBool(_allowFormatColumnsPath, !value, true);
  }

  private const string _allowFormatRowsPath = "d:sheetProtection/@formatRows";

  /// <summary>
  /// Allow users to Format rows
  /// </summary>
  public bool AllowFormatRows {
    get => !GetXmlNodeBool(_allowFormatRowsPath, true);
    set => SetXmlNodeBool(_allowFormatRowsPath, !value, true);
  }

  private const string _allowInsertColumnsPath = "d:sheetProtection/@insertColumns";

  /// <summary>
  /// Allow users to insert columns
  /// </summary>
  public bool AllowInsertColumns {
    get => !GetXmlNodeBool(_allowInsertColumnsPath, true);
    set => SetXmlNodeBool(_allowInsertColumnsPath, !value, true);
  }

  private const string _allowInsertRowsPath = "d:sheetProtection/@insertRows";

  /// <summary>
  /// Allow users to Format rows
  /// </summary>
  public bool AllowInsertRows {
    get => !GetXmlNodeBool(_allowInsertRowsPath, true);
    set => SetXmlNodeBool(_allowInsertRowsPath, !value, true);
  }

  private const string _allowInsertHyperlinksPath = "d:sheetProtection/@insertHyperlinks";

  /// <summary>
  /// Allow users to insert hyperlinks
  /// </summary>
  public bool AllowInsertHyperlinks {
    get => !GetXmlNodeBool(_allowInsertHyperlinksPath, true);
    set => SetXmlNodeBool(_allowInsertHyperlinksPath, !value, true);
  }

  private const string _allowDeleteColumns = "d:sheetProtection/@deleteColumns";

  /// <summary>
  /// Allow users to delete columns
  /// </summary>
  public bool AllowDeleteColumns {
    get => !GetXmlNodeBool(_allowDeleteColumns, true);
    set => SetXmlNodeBool(_allowDeleteColumns, !value, true);
  }

  private const string _allowDeleteRowsPath = "d:sheetProtection/@deleteRows";

  /// <summary>
  /// Allow users to delete rows
  /// </summary>
  public bool AllowDeleteRows {
    get => !GetXmlNodeBool(_allowDeleteRowsPath, true);
    set => SetXmlNodeBool(_allowDeleteRowsPath, !value, true);
  }

  private const string _allowSortPath = "d:sheetProtection/@sort";

  /// <summary>
  /// Allow users to sort a range
  /// </summary>
  public bool AllowSort {
    get => !GetXmlNodeBool(_allowSortPath, true);
    set => SetXmlNodeBool(_allowSortPath, !value, true);
  }

  private const string _allowAutoFilterPath = "d:sheetProtection/@autoFilter";

  /// <summary>
  /// Allow users to use autofilters
  /// </summary>
  public bool AllowAutoFilter {
    get => !GetXmlNodeBool(_allowAutoFilterPath, true);
    set => SetXmlNodeBool(_allowAutoFilterPath, !value, true);
  }

  private const string _allowPivotTablesPath = "d:sheetProtection/@pivotTables";

  /// <summary>
  /// Allow users to use pivottables
  /// </summary>
  public bool AllowPivotTables {
    get => !GetXmlNodeBool(_allowPivotTablesPath, true);
    set => SetXmlNodeBool(_allowPivotTablesPath, !value, true);
  }
}
