-------------------------------------------------------------------------------
-- Copyright (c) 2012 Sierra Wireless and others.
-- All rights reserved. This program and the accompanying materials
-- are made available under the terms of the Eclipse Public License v1.0
-- which accompanies this distribution, and is available at
-- http://www.eclipse.org/legal/epl-v10.html
--
-- Contributors:
--     Sierra Wireless - initial API and implementation
-------------------------------------------------------------------------------
-- A module containing generic function for test
-- @module testutil
local pp=require'metalua.pprint'
local apimodelbuilder = require 'models.apimodelbuilder'
local domhandler      = require 'domhandler'
local tablecompare    = require 'tablecompare'
local templateengine  = require 'templateengine'
local xml = require 'xml'

--
-- Loading template engine environment
--
for key, value in pairs(require 'template.utils') do
	templateengine.env[key] = value
end

local M = {}

local errorhandling = function (filename)
	local errorbuffer = {}
	return function (err, offset)
		local message = string.format(
			"An error occured while parsing html for %s at offset %d:%s\n",
			filename,
			offset,
			err
		)
		table.insert(errorbuffer, message)
	end, errorbuffer
end

---
-- Load a file in a string
-- @function [parent = #testutil] loadfile
-- @param filepath file absolute path
-- @return #string file content
function M.loadfile(filepath)

	local luafile, errormessage = io.open(filepath, 'r')
	assert(
		luafile,
		string.format('Unable to read from %s.\n%s', filepath, errormessage or '')
	)
	local filestring = luafile:read('*a')
	luafile:close()
	
	return filestring
end

---
-- Parse HTML in a table
-- @function [parent = #testutil] parsehtml
-- @param #string htmlstring html
-- @param #string filename File name to be display in case of a parsing error
-- @return table
-- @return status, errormessage in case of failure
function M.parsehtml(htmlstring, filename)
	
	-- Create parser for input html
	local handler = domhandler.createhandler()
	local xmlparser = xml.newparser(handler)
	xmlparser.options.stripWS = false
	local errorhandlingfunction, errormessages = errorhandling(filename)
	xmlparser.options.errorHandler = errorhandlingfunction
	
	-- Actual html parsing
	local status, pcallerror = pcall( function() 
		xmlparser:parse(htmlstring)
	end)
	
	-- throw error with all message
	assert(status, string.format("%s\n%s\n%s",table.concat(errormessages), tostring(pcallerror),htmlstring))
	
	--throw failure
	if #errormessages ~= 0 then
		return nil, string.format("%s\n%s",table.concat(errormessages),htmlstring)
	end
	return handler.root
end

---
-- Compare HTML and return the result with a complete error message
-- @function [parent = #testutil] comparehtml
-- @param generatedtable Table to compare
-- @param referencetable Table expected
-- @param generatedhtml Html to compare
-- @parm referencehtml Html expected
-- @return status, formattederrormessage
function M.comparehtml(generatedtable, referencetable, generatedhtml, referencehtml)
	-- Check that they are equivalent
	local equivalent = tablecompare.compare(generatedtable, referencetable)
	if #equivalent > 0 then
	
		-- Compute which keys differs
		local differentkeys = tablecompare.diff(generatedtable, referencetable)
		local differentkeysstring = pp.tostring(differentkeys, {line_max=1})
		
		-- Convert table in formatted string
		local xmlformatter = require("xmlformatter")
		local htmlformattedstring= xmlformatter.xmltostring(generatedtable)
		local htmlformattedreferencestring = xmlformatter.xmltostring(referencetable)
		
		-- Create the diff
		local diffclass = java.require("diff.match.patch.diff_match_patch")
		local diff = diffclass:new()
		local differences = diff:diff_main(htmlformattedstring,htmlformattedreferencestring)
		diff:diff_cleanupSemantic(differences)
		
		-- Prettify the result
		local diffutil = java.require("org.eclipse.ldt.lua.tests.internal.utils.DiffUtil")
		local prettydiff = diffutil:diff_pretty_diff(differences)
		
		-- Formalise first table output
		local _ = '_'
		local line = _:rep(80)
		local stringdiff = string.format('%s\nString Diff \n%s\n%s', line, line, prettydiff)
		local generatedhtml   = string.format('%s\nGenerated HTML\n%s\n%s', line, line, generatedhtml)
		local referencehtml  = string.format('%s\nReference HTML\n%s\n%s', line, line, referencehtml)
		local tablediff = string.format('%s\nTable Diff \n%s\n%s', line, line, differentkeysstring)
		local generatedtable   = string.format('%s\nGenerated table\n%s\n%s', line, line, pp.tostring(generatedtable, {line_max=1}))
		local referencetable  = string.format('%s\nReference table\n%s\n%s', line, line, pp.tostring(referencetable, {line_max=1}))
		return nil, string.format('The generated HTML is not the same as the reference:\n%s\n%s\n%s\n%s\n%s\n%s',stringdiff, generatedhtml, referencehtml, tablediff, generatedtable, referencetable)
	end
	return true
end

return M
