--[[
  This file is part of darktable,
  copyright (c) 2015 Jérémy Rosen & Pascal Obry
  edited 2016 Tejovanth N

  darktable is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation, either version 3 of the License, or
  (at your option) any later version.

  darktable 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 General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with darktable.  If not, see <http://www.gnu.org/licenses/>.
]]
--[[
SELECTION_TO_PDF
Generates a PDF file (via Latex) containing all selected images

ADDITIANAL SOFTWARE NEEDED FOR THIS SCRIPT
* a PDF-Viewer
* pdflatex (Latex)

USAGE
* require this file from your main lua config file:

This plugin will add a new exporter that will allow you to generate the pdf file

Plugin allows you to choose how many thumbnails you need per row


]]
local dt = require "darktable"
local du = require "lib/dtutils"

du.check_min_api_version("7.0.0", "selection_to_pdf")

local gettext = dt.gettext.gettext

local function _(msg)
  return gettext(msg)
end

local NIX_OPEN <const> = "xdg-open "
local MAC_OPEN <const> = "open "
local WIN_OPEN <const> = "start "

-- return data structure for script_manager

local script_data = {}

script_data.metadata = {
  name = _("selection to PDF"),
  purpose = _("generate a PDF file of selected images"),
  author = "Jérémy Rosen & Pascal Obry",
  help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/official/selection_to_pdf"
}

script_data.destroy = nil -- function to destory the script
script_data.destroy_method = nil -- set to hide for libs since we can't destroy them commpletely yet
script_data.restart = nil -- how to restart the (lib) script after it's been hidden - i.e. make it visible again
script_data.show = nil -- only required for libs since the destroy_method only hides them

dt.preferences.register
   ("selection_to_pdf","Open with","string",
    _("a PDF viewer"),
    _("can be an absolute pathname or the tool may be in the PATH\nif not specified the system default will be used to open the PDF"),
    "")

local title_widget = dt.new_widget("entry") {
    placeholder = _("title")
}
local no_of_thumbs_widget = dt.new_widget("slider")
{
    label = _("thumbs per line"), 
    soft_min = 1,     -- The soft minimum value for the slider, the slider can't go beyond this point
    soft_max = 10,    -- The soft maximum value for the slider, the slider can't go beyond this point
    hard_min = 1,     -- The hard minimum value for the slider, the user can't manually enter a value beyond this point
    hard_max = 10,    -- The hard maximum value for the slider, the user can't manually enter a value beyond this point
    value = 4         -- The current value of the slider
}
local widget = dt.new_widget("box") {
    orientation = horizontal,
    dt.new_widget("label"){label = _("title:")},
    title_widget,
    dt.new_widget("label"){label = _("thumbnails per row:")},
    no_of_thumbs_widget
}

local ending = [[
\end{document}
]]


local filename =dt.configuration.tmp_dir.."/pdfout.tex"

local function my_write(latexfile,arg)
  local res,errmsg = latexfile:write(arg)
  if not res then
    error(errmsg)
  end
end

local function thumbnail(latexfile,i,image,file)
  local title
  if image.title == "" then
    title = image.filename
    if image.duplicate_index > 0 then
      title = title.."["..image.duplicate_index.."]"
    end

  else
    title = image.title
  end

  --  fact is that latex will get confused if the filename has multiple dots.
  --  so \includegraphics{file.01.jpg} wont work. We need to output the filename
  --  and extention separated, e.g: \includegraphics{{file.01}.jpg}

  local filenoext = string.gsub(file, "(.*)(%..*)", "%1")
  local ext = string.gsub(file, "(.*)(%..*)", "%2")
  my_write(latexfile,"\\begin{minipage}[b]{"..width.."\\textwidth}\n")
  my_write(latexfile,"\\includegraphics[width=\\textwidth]{{"..filenoext.."}"..ext.."}\\newline\n")
  my_write(latexfile,"\\centering{"..i..": \\verb|"..title.."|}\n")
  my_write(latexfile,"\\end{minipage}\\quad\n")
end

local function destroy()
  dt.print_log("destroying storage")
  dt.destroy_storage("export_pdf")
  dt.print_log("done destroying")
end

dt.register_storage("export_pdf", _("export thumbnails to PDF"),
    nil,
    function(storage,image_table)
      local my_title = title_widget.text
      if my_title == "" then
        my_title = "Title"
    end
    local thumbs_per_line = no_of_thumbs_widget.value
    thumbs_per_line = tonumber(thumbs_per_line)
    width = (1 / thumbs_per_line) - 0.01

    local preamble = [[
    \documentclass[a4paper,10pt]{article}
    \usepackage{graphicx}
    \pagestyle{empty}
    \parindent0pt
    \usepackage{geometry}
    \geometry{a4paper,left=5mm,right=5mm, top=5mm, bottom=5mm}
    \begin{document}
    {\Large\bfseries ]] .. my_title .. [[} \\
    \bigskip\bigskip
    ]]

    local errmsg
    local latexfile
    latexfile,errmsg = io.open(filename, "w")
    if not latexfile then
        error(errmsg)
      end
      my_write(latexfile, preamble)
      local i = 1
      for img, file in pairs(image_table) do
         thumbnail(latexfile, i, img, file)
         if i % thumbs_per_line == 0  then
            my_write(latexfile, "\n\\bigskip\n")
         end
         i = i + 1
      end
      my_write(latexfile,ending)
      latexfile:close()

      -- convert to PDF
      local dir = string.gsub(filename, "(.*/)(.*)", "%1")
      local locfile = string.gsub(filename, "(.*/)(.*)", "%2")
      local command = "pdflatex -halt-on-error -output-directory "..dir.." "..locfile
      local result = dt.control.execute(command)
      if result ~= 0 then
        dt.print(_("problem running pdflatex")) -- this one is probably usefull to the user
        error("Problem running "..command)
      end

      -- open the PDF
      local pdffile = string.gsub(filename, ".tex", ".pdf")
      command = dt.preferences.read("selection_to_pdf","Open with","string")
      if command == "" then
        if dt.configuration.running_os == "windows" then
          command = WIN_OPEN
        elseif dt.configuration.running_os == "macos" then
          command = MAC_OPEN
        else
          command = NIX_OPEN
        end
      end
      command = command .. " " .. pdffile
      local result = dt.control.execute(command)
      if result ~= 0 then
        dt.print(_("problem running PDF viewer")) -- this one is probably usefull to the user
        error("Problem running "..command)
      end

      -- finally do some clean-up
      for img,file in pairs(image_table) do
         os.remove(file)
      end
    end,nil,nil,widget)

script_data.destroy = destroy

return script_data
--
-- vim: shiftwidth=2 expandtab tabstop=2 cindent syntax=lua
