--------------------------------------------------------------------------------
--  Copyright (c) 2011-2012 Sierra Wireless.
--  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:
--       Kevin KIN-FOO <kkinfoo@sierrawireless.com>
--           - initial API and implementation and initial documentation
--------------------------------------------------------------------------------
local M = {}

local javaexpressionbuilder = require 'javaexpressionbuilder'
local javaapimodelfactory =  require 'javaapimodelfactory'

local print = function (string) print(string) io.flush() end

local templateengine = require 'templateengine'

--
-- Update documentation templateengine environment
--
local templateengineenv = require 'template.utils'

-- Remove default implementation not supported from IDE
templateengineenv.anchortypes['externaltyperef'] = nil
templateengineenv.linktypes['externaltyperef'] = nil
templateengineenv.linktypes['file'] = nil

--
-- So far, documentation embedded in the IDE does not support links very well.
-- To circumvent this, we will need to deactivate link generation while
-- generation documentation.

-- Cache of link generation
local originallinkto = templateengineenv.linkto

-- use java library for markdown (for better performance)
templateengine.env.markdown = javaapimodelfactory.markdown

-- Restore link generators
local function enablelinks()
	templateengine.env.linkto = originallinkto
end

-- Disable link generators
local function disablelinks()
	templateengine.env.linkto = function()
		return nil, 'Link generation is disabled.'
	end
end

-- Links are disabled by default
disablelinks()

-- Handle only local item references
templateengineenv.linktypes['item'] = function(item)
	if item.parent and item.parent.tag == 'recordtypedef' then
		return string.format('#%s.%s', templateengineenv.anchor(item.parent), item.name)
	end
	return string.format('#%s', templateengineenv.anchor(item))
end

-- Perform actual environment update
for functionname, body in pairs( templateengineenv ) do
	templateengine.env[ functionname ] = body
end

-- create typeref
function M._typeref (_type,handledexpr)
	if not _type then return nil end
	if _type.tag == "externaltyperef" then
		return javaapimodelfactory.newexternaltyperef(_type.modulename, _type.typename)
	elseif _type.tag == "internaltyperef" then
		return javaapimodelfactory.newinternaltyperef(_type.typename)
	elseif _type.tag == "moduletyperef" then
		return javaapimodelfactory.newmoduletyperef(_type.modulename,_type.returnposition)
	elseif _type.tag == "exprtyperef" then
		return javaapimodelfactory.newexprtyperef(_type.returnposition,javaexpressionbuilder._expression(_type.expression,handledexpr)) 
	elseif _type.tag == "primitivetyperef" then
		return javaapimodelfactory.newprimitivetyperef(_type.typename)
	elseif _type.tag == "inlinetyperef" then
		return javaapimodelfactory.newinlinetyperef(M._typedef(_type.def,true,handledexpr))
	end
end

-- create item
function M._item(_item,notemplate,handledexpr)
	local description = ""
	if notemplate then		
		local t = {}
		if _item.shortdescription and _item.shortdescription ~= "" then table.insert(t,_item.shortdescription) end
		if _item.description and _item.description ~= "" then table.insert(t,_item.description) end
		if #t ~= 0 then description = string.format("<div style='white-space:pre'>%s</div>",table.concat(t,"\n") ) end
	else 
		description = templateengine.applytemplate(_item, 3)
	end 

	local jitem = javaapimodelfactory.newitem(_item.name,
		description,
		_item.sourcerange.min - 1,
		_item.sourcerange.max,
		M._typeref(_item.type,handledexpr)
	)
	handledexpr[_item] = jitem
	return jitem
end

-- create typedef
function M._typedef(_typedef,notemplate, handledexpr)
	local jtypedef
	-- Dealing with records
	if _typedef.tag == "recordtypedef" then

		-- manage description
		local description = ""
		if notemplate then
			local t = {}
			if _typedef.shortdescription and _typedef.shortdescription ~= "" then table.insert(t,_typedef.shortdescription) end
			if _typedef.description and _typedef.description ~= "" then table.insert(t,_typedef.description) end
			if #t ~= 0 then description = string.format("<div style='white-space:pre'>%s</div>",table.concat(t,"\n") ) end
		else
			description = templateengine.applytemplate(_typedef, 3)
		end
	
		jtypedef = javaapimodelfactory.newrecordtypedef(_typedef.name,
		    description,
			_typedef.sourcerange.min - 1,
			_typedef.sourcerange.max,
			M._typeref(_typedef.supertype),
			M._typeref(_typedef.defaultkeytyperef),
			M._typeref(_typedef.defaultvaluetyperef),
			M._typeref(_typedef.call)
		)

		-- Appending fields
		for _, _item in pairs(_typedef.fields) do
			local jitem =  M._item(_item,notemplate,handledexpr)
			javaapimodelfactory.addfield(jtypedef, jitem)
		end

	elseif _typedef.tag == "functiontypedef" then
	  
	  -- manage description
	  local description = ""
	  if notemplate then
      local t = {}
      if _typedef.shortdescription and _typedef.shortdescription ~= "" then table.insert(t,_typedef.shortdescription) end
      if _typedef.description and _typedef.description ~= "" then table.insert(t,_typedef.description) end
      if #t ~= 0 then description = string.format("<div style='white-space:pre'>%s</div>",table.concat(t,"\n") ) end
    else
      description = templateengine.applytemplate(_typedef, 3)
    end
	  
	  -- Dealing with function
		jtypedef = javaapimodelfactory.newfunctiontypedef(description)

		-- Appending parameters
		for _, _param in ipairs(_typedef.params) do
			javaapimodelfactory.addparam(jtypedef,_param.name, M._typeref(_param.type), _param.description)
		end

		-- Appending returned types
		for _, _return in ipairs(_typedef.returns) do
			local jreturn = javaapimodelfactory.newreturn()
			for _, _type in ipairs( _return.types ) do
				javaapimodelfactory.addtype(jreturn,M._typeref(_type))
			end
			javaapimodelfactory.functionaddreturn(jtypedef,jreturn)
		end
	end
	return jtypedef
end

-- create lua file api
function M._file(_file)

	local handledexpr = {}

	-- Enable links just for module file objects 
	enablelinks()
	local jfile 
	if _file.name then
		jfile = javaapimodelfactory.newfileapi(templateengine.applytemplate(_file, 1))
	else
		jfile = javaapimodelfactory.newfileapi()
	end
	disablelinks()

	-- Adding global variables
	for _, _item in pairs(_file.globalvars) do
		-- Fill Java item
		javaapimodelfactory.addglobalvar(jfile,M._item(_item,false,handledexpr))
	end

	-- Adding returned types
	for _, _return in ipairs(_file.returns) do
		local jreturn = javaapimodelfactory.newreturn()
		for _, _type in ipairs( _return.types ) do
			javaapimodelfactory.addtype(jreturn,M._typeref(_type))
		end
		javaapimodelfactory.fileapiaddreturn(jfile,jreturn)
	end

	-- Adding types defined in files
	for _, _typedef in pairs(_file.types) do
		javaapimodelfactory.addtypedef(jfile,_typedef.name,M._typedef(_typedef,false,handledexpr))
	end

	return jfile, handledexpr
end
return M
