local base = require("packages.base")

local package = pl.class(base)
package._name = "textcase"

local icu = require("justenoughicu")

function package:uppercase (input, extraArgs)
  if type(self) ~= "table" or (self.type ~= "class" and self.type ~= "package") then
    input, extraArgs = self, input
  end
  if not extraArgs then extraArgs = {} end
  if not extraArgs.options then extraArgs.options = {} end
  local lang = extraArgs.options.language or SILE.settings:get("document.language")
  return icu.case(input, lang, "upper")
end

function package:lowercase (input, extraArgs)
  if type(self) ~= "table" or (self.type ~= "class" and self.type ~= "package") then
    input, extraArgs = self, input
  end
  if not extraArgs then extraArgs = {} end
  if not extraArgs.options then extraArgs.options = {} end
  local lang = extraArgs.options.language or SILE.settings:get("document.language")
  return icu.case(input, lang, "lower")
end

function package:titlecase (input, extraArgs)
  if type(self) ~= "table" or (self.type ~= "class" and self.type ~= "package") then
    input, extraArgs = self, input
  end
  if not extraArgs then extraArgs = {} end
  if not extraArgs.options then extraArgs.options = {} end
  local lang = extraArgs.options.language or SILE.settings:get("document.language")
  return icu.case(input, lang, "title")
end

function package:_init ()
  base._init(self)
  self:loadPackage("inputfilter")
  self:deprecatedExport("uppercase", self.uppercase)
  self:deprecatedExport("lowercase", self.lowercase)
  self:deprecatedExport("titlecase", self.titlecase)
end

function package:registerCommands ()

  self:registerCommand("uppercase", function(options, content)
    SILE.process(self.class.packages.inputfilter:transformContent(content, self.uppercase, options))
  end, "Typeset the enclosed text as uppercase")

  self:registerCommand("lowercase", function(options, content)
    SILE.process(self.class.packages.inputfilter:transformContent(content, self.lowercase, options))
  end, "Typeset the enclosed text as lowercase")

  self:registerCommand("titlecase", function(options, content)
    SILE.process(self.class.packages.inputfilter:transformContent(content, self.titlecase, options))
  end, "Typeset the enclosed text as titlecase")

end

package.documentation = [[
\begin{document}
\use[module=packages.textcase]
The \autodoc:package{textcase} package provides commands for language-aware case conversion of input text.
For example, when language is set to English, then \autodoc:command{\uppercase{hij}} will return \examplefont{\uppercase{hij}}.
However, when language is set to Turkish, it will return \examplefont{\font[language=tr]{\uppercase{hij}}}.

As well as \autodoc:command{\uppercase}, the package provides the commands \autodoc:command{\lowercase} and \autodoc:command{\titlecase}.
\end{document}
]]

return package
