/*******************************************************************************
 * 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                      Total rewrite               2010-03-01
 * Jan K�llman		    License changed GPL-->LGPL  2011-12-27
 * Raziq York                       Added Created & Modified    2014-08-20
 *******************************************************************************/

using System;
using System.Globalization;
using System.Xml;

namespace AppsheetEpplus;

/// <summary>
/// Provides access to the properties bag of the package
/// </summary>
public sealed class OfficeProperties : XmlHelper {
  private readonly XmlDocument _xmlPropertiesCore;
  private readonly XmlDocument _xmlPropertiesExtended;

  private readonly Uri _uriPropertiesCore = new("/docProps/core.xml", UriKind.Relative);
  private readonly Uri _uriPropertiesExtended = new("/docProps/app.xml", UriKind.Relative);

  private readonly XmlHelper _coreHelper;
  private readonly XmlHelper _extendedHelper;

  /// <summary>
  /// Provides access to all the office document properties.
  /// </summary>
  /// <param name="package"></param>
  /// <param name="ns"></param>
  internal OfficeProperties(ExcelPackage package, XmlNamespaceManager ns)
      : base(ns) {
    const string coreBaseXml =
        $"""<?xml version="1.0" encoding="UTF-8" standalone="yes" ?><cp:coreProperties xmlns:cp="{ExcelPackage._schemaCore}" xmlns:dc="{ExcelPackage._schemaDc}" xmlns:dcterms="{ExcelPackage._schemaDcTerms}" xmlns:dcmitype="{ExcelPackage._schemaDcmiType}" xmlns:xsi="{ExcelPackage._schemaXsi}"></cp:coreProperties>""";
    _xmlPropertiesCore = package.GetOrCreateXmlDocument(
        _uriPropertiesCore,
        "application/vnd.openxmlformats-package.core-properties+xml",
        "http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties",
        coreBaseXml);
    _coreHelper = XmlHelperFactory.Create(
        ns,
        _xmlPropertiesCore.SelectSingleNode("cp:coreProperties", NameSpaceManager));

    const string extendedBaseXml =
        $"""<?xml version="1.0" encoding="UTF-8" standalone="yes" ?><Properties xmlns:vt="{ExcelPackage._schemaVt}" xmlns="{ExcelPackage._schemaExtended}"></Properties>""";
    _xmlPropertiesExtended = package.GetOrCreateXmlDocument(
        _uriPropertiesExtended,
        "application/vnd.openxmlformats-officedocument.extended-properties+xml",
        "http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties",
        extendedBaseXml);
    _extendedHelper = XmlHelperFactory.Create(ns, _xmlPropertiesExtended);
  }

  private const string _titlePath = "dc:title";

  /// <summary>
  /// Gets/sets the title property of the document (core property)
  /// </summary>
  public string Title {
    get => _coreHelper.GetXmlNodeString(_titlePath);
    set => _coreHelper.SetXmlNodeString(_titlePath, value);
  }

  private const string _subjectPath = "dc:subject";

  /// <summary>
  /// Gets/sets the subject property of the document (core property)
  /// </summary>
  public string Subject {
    get => _coreHelper.GetXmlNodeString(_subjectPath);
    set => _coreHelper.SetXmlNodeString(_subjectPath, value);
  }

  private const string _authorPath = "dc:creator";

  /// <summary>
  /// Gets/sets the author property of the document (core property)
  /// </summary>
  public string Author {
    get => _coreHelper.GetXmlNodeString(_authorPath);
    set => _coreHelper.SetXmlNodeString(_authorPath, value);
  }

  private const string _commentsPath = "dc:description";

  /// <summary>
  /// Gets/sets the comments property of the document (core property)
  /// </summary>
  public string Comments {
    get => _coreHelper.GetXmlNodeString(_commentsPath);
    set => _coreHelper.SetXmlNodeString(_commentsPath, value);
  }

  private const string _keywordsPath = "cp:keywords";

  /// <summary>
  /// Gets/sets the keywords property of the document (core property)
  /// </summary>
  public string Keywords {
    get => _coreHelper.GetXmlNodeString(_keywordsPath);
    set => _coreHelper.SetXmlNodeString(_keywordsPath, value);
  }

  private const string _lastModifiedByPath = "cp:lastModifiedBy";

  /// <summary>
  /// Gets/sets the lastModifiedBy property of the document (core property)
  /// </summary>
  public string LastModifiedBy {
    get => _coreHelper.GetXmlNodeString(_lastModifiedByPath);
    set => _coreHelper.SetXmlNodeString(_lastModifiedByPath, value);
  }

  private const string _lastPrintedPath = "cp:lastPrinted";

  /// <summary>
  /// Gets/sets the lastPrinted property of the document (core property)
  /// </summary>
  public string LastPrinted {
    get => _coreHelper.GetXmlNodeString(_lastPrintedPath);
    set => _coreHelper.SetXmlNodeString(_lastPrintedPath, value);
  }

  private const string _createdPath = "dcterms:created";

  /// <summary>
  /// Gets/sets the created property of the document (core property)
  /// </summary>
  public DateTime Created {
    get =>
      DateTime.TryParse(_coreHelper.GetXmlNodeString(_createdPath), out var date)
          ? date
          : DateTime.MinValue;
    set {
      var dateString = value.ToUniversalTime().ToString("s", CultureInfo.InvariantCulture) + "Z";
      _coreHelper.SetXmlNodeString(_createdPath, dateString);
      _coreHelper.SetXmlNodeString(_createdPath + "/@xsi:type", "dcterms:W3CDTF");
    }
  }

  private const string _categoryPath = "cp:category";

  /// <summary>
  /// Gets/sets the category property of the document (core property)
  /// </summary>
  public string Category {
    get => _coreHelper.GetXmlNodeString(_categoryPath);
    set => _coreHelper.SetXmlNodeString(_categoryPath, value);
  }

  private const string _contentStatusPath = "cp:contentStatus";

  /// <summary>
  /// Gets/sets the status property of the document (core property)
  /// </summary>
  public string Status {
    get => _coreHelper.GetXmlNodeString(_contentStatusPath);
    set => _coreHelper.SetXmlNodeString(_contentStatusPath, value);
  }

  /// <summary>
  /// Provides access to the XML document that holds the extended properties of the document (app.xml)
  /// </summary>
  public XmlDocument ExtendedPropertiesXml {
    get {
      if (_xmlPropertiesExtended == null) {}
      return (_xmlPropertiesExtended);
    }
  }

  private const string _applicationPath = "xp:Properties/xp:Application";

  /// <summary>
  /// Gets/Set the Application property of the document (extended property)
  /// </summary>
  public string Application {
    get => _extendedHelper.GetXmlNodeString(_applicationPath);
    set => _extendedHelper.SetXmlNodeString(_applicationPath, value);
  }

  private const string _hyperlinkBasePath = "xp:Properties/xp:HyperlinkBase";

  /// <summary>
  /// Gets/sets the HyperlinkBase property of the document (extended property)
  /// </summary>
  public Uri HyperlinkBase {
    get => new(_extendedHelper.GetXmlNodeString(_hyperlinkBasePath), UriKind.Absolute);
    set => _extendedHelper.SetXmlNodeString(_hyperlinkBasePath, value.AbsoluteUri);
  }

  private const string _appVersionPath = "xp:Properties/xp:AppVersion";

  /// <summary>
  /// Gets/Set the AppVersion property of the document (extended property)
  /// </summary>
  public string AppVersion {
    get => _extendedHelper.GetXmlNodeString(_appVersionPath);
    set => _extendedHelper.SetXmlNodeString(_appVersionPath, value);
  }

  private const string _companyPath = "xp:Properties/xp:Company";

  /// <summary>
  /// Gets/sets the Company property of the document (extended property)
  /// </summary>
  public string Company {
    get => _extendedHelper.GetXmlNodeString(_companyPath);
    set => _extendedHelper.SetXmlNodeString(_companyPath, value);
  }

  private const string _managerPath = "xp:Properties/xp:Manager";

  /// <summary>
  /// Gets/sets the Manager property of the document (extended property)
  /// </summary>
  public string Manager {
    get => _extendedHelper.GetXmlNodeString(_managerPath);
    set => _extendedHelper.SetXmlNodeString(_managerPath, value);
  }

  private const string _modifiedPath = "dcterms:modified";

  /// <summary>
  /// Gets/sets the modified property of the document (core property)
  /// </summary>
  public DateTime Modified {
    get =>
      DateTime.TryParse(_coreHelper.GetXmlNodeString(_modifiedPath), out var date)
          ? date
          : DateTime.MinValue;
    set {
      var dateString = value.ToUniversalTime().ToString("s", CultureInfo.InvariantCulture) + "Z";
      _coreHelper.SetXmlNodeString(_modifiedPath, dateString);
      _coreHelper.SetXmlNodeString(_modifiedPath + "/@xsi:type", "dcterms:W3CDTF");
    }
  }
}
