--[[
 Copyright 2016 ARATA Mizuki

 This file is part of ClutTeX.

 ClutTeX 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.

 ClutTeX 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 ClutTeX.  If not, see <http://www.gnu.org/licenses/>.
]]

local assert = assert
local os = os
local os_execute = os.execute
local os_remove = os.remove
local filesys = require "lfs"
local pathutil = require "texrunner.pathutil"
local shellutil = require "texrunner.shellutil"
local escape = shellutil.escape

local copy_command
if os.type == "windows" then
 function copy_command(from, to)
   -- TODO: What if `from` begins with a slash?
   return "copy " .. escape(from) .. " " .. escape(to) .. " > NUL"
 end
else
 function copy_command(from, to)
   -- TODO: What if `from` begins with a hypen?
   return "cp " .. escape(from) .. " " .. escape(to)
 end
end

local isfile = filesys.isfile or function(path)
 return filesys.attributes(path, "mode") == "file"
end

local isdir = filesys.isdir or function(path)
 return filesys.attributes(path, "mode") == "directory"
end

local function mkdir_rec(path)
 local succ, err = filesys.mkdir(path)
 if not succ then
   succ, err = mkdir_rec(pathutil.parentdir(path))
   if succ then
     return filesys.mkdir(path)
   end
 end
 return succ, err
end

local function remove_rec(path)
 if isdir(path) then
   for file in filesys.dir(path) do
     if file ~= "." and file ~= ".." then
       local succ, err = remove_rec(pathutil.join(path, file))
       if not succ then
         return succ, err
       end
     end
   end
   return filesys.rmdir(path)
 else
   return os_remove(path)
 end
end

return {
 copy_command = copy_command,
 isfile = isfile,
 isdir = isdir,
 mkdir_rec = mkdir_rec,
 remove_rec = remove_rec,
}