# frozen_string_literal: true

module Axlsx
  # XML Encoding
  ENCODING = "UTF-8"

  # spreadsheetML namespace
  XML_NS = "http://schemas.openxmlformats.org/spreadsheetml/2006/main"

  # content-types namespace
  XML_NS_T = "http://schemas.openxmlformats.org/package/2006/content-types"

  # extended-properties namespace
  APP_NS = "http://schemas.openxmlformats.org/officeDocument/2006/extended-properties"

  # doc props namespace
  APP_NS_VT = "http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"

  # core properties namespace
  CORE_NS = "http://schemas.openxmlformats.org/package/2006/metadata/core-properties"

  # dc elements (core) namespace
  CORE_NS_DC = "http://purl.org/dc/elements/1.1/"

  # dcmit (core) namespcace
  CORE_NS_DCMIT = "http://purl.org/dc/dcmitype/"

  # dc terms namespace
  CORE_NS_DCT = "http://purl.org/dc/terms/"

  # xml schema namespace
  CORE_NS_XSI = "http://www.w3.org/2001/XMLSchema-instance"

  # Digital signature namespace
  DIGITAL_SIGNATURE_NS = "http://schemas.openxmlformats.org/package/2006/digital-signature"

  # spreadsheet drawing namespace
  XML_NS_XDR = "http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing"

  # drawing namespace
  XML_NS_A  = "http://schemas.openxmlformats.org/drawingml/2006/main"

  # chart namespace
  XML_NS_C  = "http://schemas.openxmlformats.org/drawingml/2006/chart"

  # relationships namespace
  XML_NS_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships"

  # relationships name space
  RELS_R = "http://schemas.openxmlformats.org/package/2006/relationships"

  # table rels namespace
  TABLE_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/table"

  # pivot table rels namespace
  PIVOT_TABLE_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/pivotTable"

  # pivot table cache definition namespace
  PIVOT_TABLE_CACHE_DEFINITION_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/pivotCacheDefinition"

  # workbook rels namespace
  WORKBOOK_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"

  # worksheet rels namespace
  WORKSHEET_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet"

  # app rels namespace
  APP_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties"

  # core rels namespace
  CORE_R = "http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties"

  # digital signature rels namespace
  DIGITAL_SIGNATURE_R = "http://schemas.openxmlformats.org/package/2006/relationships/digital- signature/signature"

  # styles rels namespace
  STYLES_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles"

  # shared strings namespace
  SHARED_STRINGS_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings"

  # theme rels namespace
  THEME_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme"

  # drawing rels namespace
  DRAWING_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing"

  # chart rels namespace
  CHART_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart"

  # image rels namespace
  IMAGE_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image"

  # hyperlink rels namespace
  HYPERLINK_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink"

  # comment rels namespace
  COMMENT_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments"

  # comment relation for nil target
  COMMENT_R_NULL = "http://purl.oclc.org/ooxml/officeDocument/relationships/comments"

  # vml drawing relation namespace
  VML_DRAWING_R = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing'

  # VML Drawing content type
  VML_DRAWING_CT = "application/vnd.openxmlformats-officedocument.vmlDrawing"

  # table content type
  TABLE_CT = "application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml"

  # pivot table content type
  PIVOT_TABLE_CT = "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml"

  # pivot table cache definition content type
  PIVOT_TABLE_CACHE_DEFINITION_CT = "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml"

  # workbook content type
  WORKBOOK_CT = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"

  # app content type
  APP_CT = "application/vnd.openxmlformats-officedocument.extended-properties+xml"

  # rels content type
  RELS_CT = "application/vnd.openxmlformats-package.relationships+xml"

  # styles content type
  STYLES_CT = "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml"

  # xml content type
  XML_CT = "application/xml"

  # worksheet content type
  WORKSHEET_CT = "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"

  # shared strings content type
  SHARED_STRINGS_CT = "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml"

  # theme content type
  THEME_CT = "application/vnd.openxmlformats-officedocument.theme+xml"

  # core content type
  CORE_CT = "application/vnd.openxmlformats-package.core-properties+xml"

  # digital signature xml content type
  DIGITAL_SIGNATURE_XML_CT = "application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml"

  # digital signature origin content type
  DIGITAL_SIGNATURE_ORIGIN_CT = "application/vnd.openxmlformats-package.digital-signature-origin"

  # digital signature certificate content type
  DIGITAL_SIGNATURE_CERTIFICATE_CT = "application/vnd.openxmlformats-package.digital-signature-certificate"

  # chart content type
  CHART_CT = "application/vnd.openxmlformats-officedocument.drawingml.chart+xml"

  # comments content type
  COMMENT_CT = "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml"

  # jpeg content type
  JPEG_CT = "image/jpeg"

  # gif content type
  GIF_CT = "image/gif"

  # png content type
  PNG_CT = "image/png"

  # drawing content type
  DRAWING_CT = "application/vnd.openxmlformats-officedocument.drawing+xml"

  # xml content type extensions
  XML_EX = "xml"

  # jpeg extensions
  JPEG_EXS = ["jpeg", "jpg"].freeze

  # gif extension
  GIF_EX = "gif"

  # png extension
  PNG_EX = "png"

  # rels content type extension
  RELS_EX = "rels"

  # workbook part
  WORKBOOK_PN = "xl/workbook.xml"

  # styles part
  STYLES_PN = "styles.xml"

  # shared_strings  part
  SHARED_STRINGS_PN = "sharedStrings.xml"

  # theme part
  THEME_PN = "theme/theme1.xml"

  # app part
  APP_PN = "docProps/app.xml"

  # core part
  CORE_PN = "docProps/core.xml"

  # content types part
  CONTENT_TYPES_PN = "[Content_Types].xml"

  # rels part
  RELS_PN = "_rels/.rels"

  # workbook rels part
  WORKBOOK_RELS_PN = "xl/_rels/workbook.xml.rels"

  # worksheet part
  WORKSHEET_PN = "worksheets/sheet%d.xml"

  # worksheet rels part
  WORKSHEET_RELS_PN = "worksheets/_rels/sheet%d.xml.rels"

  # drawing part
  DRAWING_PN = "drawings/drawing%d.xml"

  # drawing rels part
  DRAWING_RELS_PN = "drawings/_rels/drawing%d.xml.rels"

  # vml drawing part
  VML_DRAWING_PN = "drawings/vmlDrawing%d.vml"

  # drawing part
  TABLE_PN = "tables/table%d.xml"

  # pivot table parts
  PIVOT_TABLE_PN = "pivotTables/pivotTable%d.xml"

  # pivot table cache definition part name
  PIVOT_TABLE_CACHE_DEFINITION_PN = "pivotCache/pivotCacheDefinition%d.xml"

  # pivot table rels parts
  PIVOT_TABLE_RELS_PN = "pivotTables/_rels/pivotTable%d.xml.rels"

  # chart part
  CHART_PN = "charts/chart%d.xml"

  # chart part
  IMAGE_PN = "media/image%d.%s"

  # comment part
  COMMENT_PN = "comments%d.xml"

  # location of schema files for validation
  SCHEMA_BASE = "#{File.dirname(__FILE__)}/../../schema/"

  # App validation schema
  APP_XSD = "#{SCHEMA_BASE}shared-documentPropertiesExtended.xsd"

  # core validation schema
  CORE_XSD = "#{SCHEMA_BASE}opc-coreProperties.xsd"

  # content types validation schema
  CONTENT_TYPES_XSD = "#{SCHEMA_BASE}opc-contentTypes.xsd"

  # rels validation schema
  RELS_XSD = "#{SCHEMA_BASE}opc-relationships.xsd"

  # spreadsheetML validation schema
  SML_XSD = "#{SCHEMA_BASE}sml.xsd"

  # drawing validation schema
  DRAWING_XSD = "#{SCHEMA_BASE}dml-spreadsheetDrawing.xsd"

  # theme validation schema
  THEME_XSD = "#{SCHEMA_BASE}dml-main.xsd"

  # number format id for percentage formatting using the default formatting id.
  NUM_FMT_PERCENT = 9

  # number format id for date format like 2011/11/13
  NUM_FMT_YYYYMMDD = 100

  # number format id for time format the creates 2011/11/13 12:23:10
  NUM_FMT_YYYYMMDDHHMMSS = 101

  # cellXfs id for thin borders around the cell
  STYLE_THIN_BORDER = 1

  # cellXfs id for default date styling
  STYLE_DATE = 2

  # worksheet maximum name length
  WORKSHEET_MAX_NAME_LENGTH = 31

  # worksheet name forbidden characters
  WORKSHEET_NAME_FORBIDDEN_CHARS = '[]*/\?:'.chars.freeze

  # error messages RestrictionValidor
  ERR_RESTRICTION = "Invalid Data: %s. %s must be one of %s."

  # error message DataTypeValidator
  ERR_TYPE = "Invalid Data %s for %s. must be %s."

  # error message for RegexValidator
  ERR_REGEX = "Invalid Data. %s does not match %s."

  # error message for RangeValidator
  ERR_RANGE = "Invalid Data. %s must be between %s and %s, (inclusive:%s) you gave: %s"

  # error message for sheets that use explicit empty string name
  ERR_SHEET_NAME_EMPTY = "Your worksheet name is empty. Worksheet name can't be empty. Please assign name of your sheet or don't use name option at all."

  # error message for sheets that use a name which is longer than 31 bytes
  ERR_SHEET_NAME_TOO_LONG = "Your worksheet name '%s' is too long. Worksheet names must be #{WORKSHEET_MAX_NAME_LENGTH} characters (bytes) or less"

  # error message for sheets that use a name which include invalid characters
  ERR_SHEET_NAME_CHARACTER_FORBIDDEN = "Your worksheet name '%s' contains a character which is not allowed by MS Excel and will cause repair warnings. Please change the name of your sheet."

  # error message for duplicate sheet names
  ERR_DUPLICATE_SHEET_NAME = "There is already a worksheet in this workbook named '%s'. Please use a unique name"

  # error message when user does not provide color and or style options for border in Style#add_sytle
  ERR_INVALID_BORDER_OPTIONS = "border hash must include both style and color. e.g. :border => { :color => 'FF000000', :style => :thin }. You provided: %s"

  # error message for invalid border id reference
  ERR_INVALID_BORDER_ID = "The border id you specified (%s) does not exist. Please add a border with Style#add_style before referencing its index."

  # error message for invalid angles
  ERR_ANGLE = "Angles must be a value between -90 and 90. You provided: %s"

  # error message for non 'integerish' value
  ERR_INTEGERISH = "You value must be, or be castable via to_i, an Integer. You provided %s"

  # error message for invalid cell reference
  ERR_CELL_REFERENCE_INVALID = "Invalid cell definition `%s`"

  # error message for cell reference with last cell missing
  ERR_CELL_REFERENCE_MISSING_CELL = "Missing cell `%s` for the specified range `%s`"

  # Regex to match forbidden control characters
  # The following will be automatically stripped from worksheets.
  #
  # x00 Null
  # x01 Start Of Heading
  # x02 Start Of Text
  # x03End Of Text
  # x04 End Of Transmission
  # x05 Enquiry
  # x06 Acknowledge
  # x07 Bell
  # x08 Backspace
  # x0B Line Tabulation
  # x0C Form Feed
  # x0E Shift Out
  # x0F Shift In
  # x10 Data Link Escape
  # x11 Device Control One
  # x12 Device Control Two
  # x13 Device Control Three
  # x14 Device Control Four
  # x15 Negative Acknowledge
  # x16 Synchronous Idle
  # x17 End Of Transmission Block
  # x18 Cancel
  # x19 End Of Medium
  # x1A Substitute
  # x1B Escape
  # x1C Information Separator Four
  # x1D Information Separator Three
  # x1E Information Separator Two
  # x1F Information Separator One
  #
  # The following are not dealt with.
  # If you have this in your data, expect Excel to blow up!
  #
  # x7F	Delete
  # x80	Control 0080
  # x81	Control 0081
  # x82	Break Permitted Here
  # x83	No Break Here
  # x84	Control 0084
  # x85	Next Line (Nel)
  # x86	Start Of Selected Area
  # x87	End Of Selected Area
  # x88	Character Tabulation Set
  # x89	Character Tabulation With Justification
  # x8A	Line Tabulation Set
  # x8B	Partial Line Forward
  # x8C	Partial Line Backward
  # x8D	Reverse Line Feed
  # x8E	Single Shift Two
  # x8F	Single Shift Three
  # x90	Device Control String
  # x91	Private Use One
  # x92	Private Use Two
  # x93	Set Transmit State
  # x94	Cancel Character
  # x95	Message Waiting
  # x96	Start Of Guarded Area
  # x97	End Of Guarded Area
  # x98	Start Of String
  # x99	Control 0099
  # x9A	Single Character Introducer
  # x9B	Control Sequence Introducer
  # x9C	String Terminator
  # x9D	Operating System Command
  # x9E	Privacy Message
  # x9F	Application Program Command
  #
  # The following are allowed:
  #
  # x0A Line Feed (Lf)
  # x0D Carriage Return (Cr)
  # x09 Character Tabulation
  # @see https://www.codetable.net/asciikeycodes
  pattern = "\x0-\x08\x0B\x0C\x0E-\x1F".encode(Encoding::UTF_8)

  # The regular expression used to remove control characters from worksheets
  CONTROL_CHARS = pattern.freeze

  # ISO 8601 date recognition
  ISO_8601_REGEX = /\A(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[0-1]|0[1-9]|[1-2][0-9])T(2[0-3]|[0-1][0-9]):([0-5][0-9]):([0-5][0-9])(\.[0-9]+)?\Z/.freeze

  # FLOAT recognition
  SAFE_FLOAT_REGEX = /\A[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]{1,2})?\Z/.freeze
  MAYBE_FLOAT_REGEX = /\A[-+]?[0-9]*\.?[0-9]+[eE](?<exp>[-+]?[0-9]{3})\Z/.freeze

  # Numeric recognition
  NUMERIC_REGEX = /\A[+-]?\d+?\Z/.freeze

  # Leading characters that indicate a formula.
  # See: https://owasp.org/www-community/attacks/CSV_Injection
  FORMULA_PREFIX = '='

  # Leading characters that indicate an array formula.
  ARRAY_FORMULA_PREFIX = '{='

  # Trailing character that indicates an array formula.
  ARRAY_FORMULA_SUFFIX = '}'

  BOOLEAN_VALUES = [true, false].freeze
end
