--------------------------------------------------------------------------------
--  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:
--       Simon BERNARD <sbernard@sierrawireless.com>
--           - initial API and implementation and initial documentation
--------------------------------------------------------------------------------
local apimodel = require "models.apimodel"
local ldp      = require "models.ldparser"
local Q        = require "metalua.treequery"

local M = {}

local handledcomments={} -- cache to know the comment already handled

----
-- UTILITY METHODS
local primitivetypes = {
  ['boolean']  = true,
  ['function'] = true,
  ['nil']      = true,
  ['number']   = true,
  ['string']   = true,
  ['thread']   = true,
  ['userdata'] = true,
  ['list']     = true,
  ['map']      = true,
  ['any']      = true

}

-- get or create the typedef with the name "name"
local function gettypedef(_file,name,kind,sourcerangemin,sourcerangemax)
  local kind = kind or "recordtypedef"
  local _typedef = _file.types[name]
  if _typedef then
    if _typedef.tag == kind then return _typedef end
  else
    if kind == "recordtypedef" and name ~= "global" then
      local _recordtypedef = apimodel._recordtypedef(name)

      -- define sourcerange
      _recordtypedef.sourcerange.min = sourcerangemin
      _recordtypedef.sourcerange.max = sourcerangemax

      -- add to file if a name is defined
      if _recordtypedef.name then _file:addtype(_recordtypedef) end
      return _recordtypedef
    elseif kind == "functiontypedef" then
      -- TODO support function
      return nil
    else
      return nil
    end
  end
  return nil
end


-- create a typeref from the typref doc_tag
local function createtyperef(dt_typeref,_file,sourcerangemin,sourcerangemax)
  local _typeref
  if dt_typeref.tag == "typeref" then
    if dt_typeref.module then
      -- manage external type
      _typeref = apimodel._externaltypref()
      _typeref.modulename = dt_typeref.module
      _typeref.typename = dt_typeref.type
    else
      if dt_typeref.type == "table" then
        -- manage special table type
        _typeref = apimodel._inlinetyperef(apimodel._recordtypedef("table"))
      elseif dt_typeref.type == "list" or dt_typeref.type == "map" then
        -- manage structures
        local structuretypedef = apimodel._recordtypedef(dt_typeref)
        structuretypedef.defaultvaluetyperef = createtyperef(dt_typeref.valuetype)
        if dt_typeref.type == "map" then
          structuretypedef.defaultkeytyperef = createtyperef(dt_typeref.keytype)
        end
        structuretypedef.structurekind = dt_typeref.type
        structuretypedef.name = dt_typeref.type
        _typeref = apimodel._inlinetyperef(structuretypedef)
      elseif primitivetypes[dt_typeref.type] then
        -- manage primitive types
        _typeref = apimodel._primitivetyperef()
        _typeref.typename = dt_typeref.type
      else
        -- manage internal type
        _typeref = apimodel._internaltyperef()
        _typeref.typename = dt_typeref.type
        if _file then
          gettypedef(_file, _typeref.typename, "recordtypedef", sourcerangemin,sourcerangemax)
        end
      end
    end
  end
  return _typeref
end

-- create a return from the return doc_tag
local function createreturn(dt_return,_file,sourcerangemin,sourcerangemax)
  local _return = apimodel._return()

  _return.description = dt_return.description

  -- manage typeref
  if dt_return.types then
    for _, dt_typeref in ipairs(dt_return.types) do
      local _typeref = createtyperef(dt_typeref,_file,sourcerangemin,sourcerangemax)
      if _typeref then
        table.insert(_return.types,_typeref)
      end
    end
  end
  return _return
end

-- create a item from the field doc_tag
local function createfield(dt_field,_file,sourcerangemin,sourcerangemax)
  local _item = apimodel._item(dt_field.name)

  if dt_field.shortdescription then
    _item.shortdescription = dt_field.shortdescription
    _item.description = dt_field.description
  else
    _item.shortdescription = dt_field.description
  end

  -- manage typeref
  local dt_typeref = dt_field.type
  if dt_typeref then
    _item.type =  createtyperef(dt_typeref,_file,sourcerangemin,sourcerangemax)
  end
  return _item
end

-- create a param from the param doc_tag
local function createparam(dt_param,_file,sourcerangemin,sourcerangemax)
  if not dt_param.name then return nil end

  local _parameter = apimodel._parameter(dt_param.name)
  _parameter.description = dt_param.description

  -- manage typeref
  local dt_typeref = dt_param.type
  if dt_typeref then
    _parameter.type =  createtyperef(dt_typeref,_file,sourcerangemin,sourcerangemax)
  end
  return _parameter
end

-- get or create the typedef with the name "name"
function M.additemtoparent(_file,_item,scope,sourcerangemin,sourcerangemax)
  if scope and not scope.module then
    if _item.name then
      if scope.type == "global" then
        _file:addglobalvar(_item)
      else
        local _recordtypedef = gettypedef (_file, scope.type ,"recordtypedef",sourcerangemin,sourcerangemax)
        _recordtypedef:addfield(_item)
      end
    else
      -- if no item name precise we store the scope in the item to be able to add it to the right parent later
      _item.scope = scope
    end
  end
end

-- Function type counter
local i = 0

-- Reset function type counter
local function resetfunctiontypeidgenerator()
  i = 0
end

-- Provides an unique index for a function type
local function generatefunctiontypeid()
  i = i + 1
  return i
end

-- generate a function type name
local function generatefunctiontypename(_functiontypedef)
  local name = {"__"}
  if _functiontypedef.returns and _functiontypedef.returns[1] then
    local ret =  _functiontypedef.returns[1]
    for _, type in ipairs(ret.types) do
      if type.typename then
        if type.modulename then
          table.insert(name,type.modulename)
        end
        table.insert(name,"#")
        table.insert(name,type.typename)
      end
    end

  end
  table.insert(name,"=")
  if _functiontypedef.params then
    for _, param in ipairs(_functiontypedef.params) do
      local type =  param.type
      if type then
        if type.typename then
          if type.modulename then
            table.insert(name,type.modulename)
          end
          table.insert(name,"#")
          table.insert(name,type.typename)
        else
          table.insert(name,"#unknown")
        end
      end
      table.insert(name,"[")
      table.insert(name,param.name)
      table.insert(name,"]")
    end
  end
  table.insert(name,"__")
  table.insert(name, generatefunctiontypeid())
  return table.concat(name)
end

--
-- Store user defined tags
--
local function attachmetadata(apiobj, parsedcomment)
  local thirdtags = parsedcomment and parsedcomment.unknowntags
  if thirdtags  then
    -- Define a storage index for user defined tags on current API element
    if not apiobj.metadata then apiobj.metadata = {} end

    -- Loop over user defined tags
    for usertag, taglist in pairs(thirdtags) do
      if not apiobj.metadata[ usertag ] then
        apiobj.metadata[ usertag ] = {
          tag = usertag
        }
      end
      for _, tag in ipairs( taglist ) do
        table.insert(apiobj.metadata[usertag], tag)
      end
    end
  end
end


------------------------------------------------------
-- create the module api
function M.createmoduleapi(ast,modulename)

  -- Initialise function type naming
  resetfunctiontypeidgenerator()

  local _file = apimodel._file()

  local _comment2apiobj = {}

  local function handlecomment(comment)

    -- Extract information from tagged comments
    local parsedcomment = ldp.parse(comment[1])
    if not parsedcomment then return nil end

    -- Get tags from the languages
    local regulartags = parsedcomment.tags

    -- Will contain last API object generated from comments
    local _lastapiobject

    -- if comment is an ld comment
    if regulartags then
      -- manage "module" comment
      if regulartags["module"] then
        -- get name
        _file.name = regulartags["module"][1].name or modulename
        _lastapiobject = _file

        -- manage descriptions
        _file.shortdescription = parsedcomment.shortdescription
        _file.description = parsedcomment.description

        local sourcerangemin = comment.lineinfo.first.offset
        local sourcerangemax = comment.lineinfo.last.offset

        -- manage returns
        if regulartags ["return"] then
          for _, dt_return in ipairs(regulartags ["return"]) do
            local _return = createreturn(dt_return,_file,sourcerangemin,sourcerangemax)
            table.insert(_file.returns,_return)
          end
        end
        -- if no returns on module create a defaultreturn of type #modulename
        if #_file.returns == 0 and _file.name then
          -- create internal type ref
          local _typeref = apimodel._internaltyperef()
          _typeref.typename = _file.name

          -- create return
          local _return = apimodel._return()
          table.insert(_return.types,_typeref)

          -- add return
          table.insert(_file.returns,_return)

          --create recordtypedef is not define
          local _moduletypedef = gettypedef(_file,_typeref.typename,"recordtypedef",sourcerangemin,sourcerangemax)

          -- manage extends (inheritance) and structure tags
          if _moduletypedef and _moduletypedef.tag == "recordtypedef" then
            if regulartags["extends"]	and regulartags["extends"][1] then
              local supertype = regulartags["extends"][1].type
              if supertype then _moduletypedef.supertype = createtyperef(supertype) end
            end
            if regulartags["map"] and regulartags["map"][1] then
              local keytype = regulartags["map"][1].keytype
              local valuetype = regulartags["map"][1].valuetype
              if keytype and valuetype then
                _moduletypedef.defaultkeytyperef = createtyperef(keytype)
                _moduletypedef.defaultvaluetyperef = createtyperef(valuetype)
                _moduletypedef.structurekind = "map"
                _moduletypedef.structuredescription = regulartags["map"][1].description
              end
            elseif regulartags["list"] and regulartags["list"][1] then
              local type = regulartags["list"][1].type
              if type then
                _moduletypedef.defaultvaluetyperef = createtyperef(type)
                _moduletypedef.structurekind = "list"
                _moduletypedef.structuredescription = regulartags["list"][1].description
              end
            end
          end
        end
        -- manage "type" comment
      elseif regulartags["type"] and regulartags["type"][1].name ~= "global" then
        local dt_type = regulartags["type"][1];
        -- create record type if it doesn't exist
        local sourcerangemin = comment.lineinfo.first.offset
        local sourcerangemax = comment.lineinfo.last.offset
        local _recordtypedef = gettypedef (_file, dt_type.name ,"recordtypedef",sourcerangemin,sourcerangemax)
        _lastapiobject = _recordtypedef

        -- re-set sourcerange in case the type was created before the type tag
        _recordtypedef.sourcerange.min = sourcerangemin
        _recordtypedef.sourcerange.max = sourcerangemax

        -- manage description
        _recordtypedef.shortdescription = parsedcomment.shortdescription
        _recordtypedef.description = parsedcomment.description

        -- manage fields
        if regulartags["field"] then
          for _, dt_field in ipairs(regulartags["field"]) do
            local _item = createfield(dt_field,_file,sourcerangemin,sourcerangemax)
            -- define sourcerange only if we create it
            _item.sourcerange.min = sourcerangemin
            _item.sourcerange.max = sourcerangemax
            if _item and _item.name then
              _recordtypedef:addfield(_item) end
          end
        end

        -- manage extends (inheritance)
        if regulartags["extends"] and regulartags["extends"][1] then
          local supertype = regulartags["extends"][1].type
          if supertype then _recordtypedef.supertype = createtyperef(supertype) end
        end

        -- manage structure tag
        if regulartags["map"] and regulartags["map"][1] then
          local keytype = regulartags["map"][1].keytype
          local valuetype = regulartags["map"][1].valuetype
          if keytype and valuetype then
            _recordtypedef.defaultkeytyperef = createtyperef(keytype)
            _recordtypedef.defaultvaluetyperef = createtyperef(valuetype)
            _recordtypedef.structurekind = "map"
            _recordtypedef.structuredescription = regulartags["map"][1].description
          end
        elseif regulartags["list"] and regulartags["list"][1] then
          local type = regulartags["list"][1].type
          if type then
            _recordtypedef.defaultvaluetyperef = createtyperef(type)
            _recordtypedef.structurekind = "list"
            _recordtypedef.structuredescription = regulartags["list"][1].description
          end
        end
      elseif regulartags["field"] then
        local dt_field = regulartags["field"][1]

        -- create item
        local sourcerangemin = comment.lineinfo.first.offset
        local sourcerangemax = comment.lineinfo.last.offset
        local _item = createfield(dt_field,_file,sourcerangemin,sourcerangemax)
        _item.shortdescription = parsedcomment.shortdescription
        _item.description = parsedcomment.description
        _lastapiobject = _item

        -- define sourcerange
        _item.sourcerange.min = sourcerangemin
        _item.sourcerange.max = sourcerangemax

        -- add item to its parent
        local scope = regulartags["field"][1].parent
        M.additemtoparent(_file,_item,scope,sourcerangemin,sourcerangemax)
      elseif regulartags["function"] or regulartags["param"] or regulartags["return"] or regulartags["callof"] then
        -- create item
        local _item = apimodel._item()
        _item.shortdescription = parsedcomment.shortdescription
        _item.description = parsedcomment.description
        _lastapiobject = _item

        -- set name
        if regulartags["function"] then	_item.name =  regulartags["function"][1].name end

        -- define sourcerange
        local sourcerangemin = comment.lineinfo.first.offset
        local sourcerangemax = comment.lineinfo.last.offset
        _item.sourcerange.min = sourcerangemin
        _item.sourcerange.max = sourcerangemax


        -- create function type
        local _functiontypedef = apimodel._functiontypedef()
        _functiontypedef.shortdescription = parsedcomment.shortdescription
        _functiontypedef.description = parsedcomment.description


        -- manage params
        if regulartags["param"] then
          for _, dt_param in ipairs(regulartags["param"]) do
            local _param = createparam(dt_param,_file,sourcerangemin,sourcerangemax)
            table.insert(_functiontypedef.params,_param)
          end
        end

        -- manage returns
        if regulartags["return"] then
          for _, dt_return in ipairs(regulartags["return"]) do
            local _return = createreturn(dt_return,_file,sourcerangemin,sourcerangemax)
            table.insert(_functiontypedef.returns,_return)
          end
        end

        -- add type name
        _functiontypedef.name = generatefunctiontypename(_functiontypedef)
        attachmetadata(_functiontypedef, parsedcomment)
        _file:addtype(_functiontypedef)

        -- create ref to this type
        local _internaltyperef = apimodel._internaltyperef()
        _internaltyperef.typename = _functiontypedef.name
        _item.type=_internaltyperef

        -- add item to its parent
        local sourcerangemin = comment.lineinfo.first.offset
        local sourcerangemax = comment.lineinfo.last.offset
        local scope = (regulartags["function"] and regulartags["function"][1].parent) or nil
        M.additemtoparent(_file,_item,scope,sourcerangemin,sourcerangemax)

        -- manage callof
        if regulartags["callof"] and regulartags["callof"][1] and regulartags["callof"][1].type then
          -- get the type which will be callable !
          local _internaltyperef = createtyperef(regulartags["callof"][1].type)
          if _internaltyperef and _internaltyperef.tag == "internaltyperef" then
            local _typedeftypedef = gettypedef(_file,_internaltyperef.typename,"recordtypedef",sourcerangemin,sourcerangemax)
            if _typedeftypedef then
              -- refer the function used when the type is called
              local _internaltyperef = apimodel._internaltyperef()
              _internaltyperef.typename = _functiontypedef.name
              _typedeftypedef.call =_internaltyperef
            end
          end
        end
      end
    end

    -- when we could not know which type of api object it is, we suppose this is an item
    if not _lastapiobject then
      _lastapiobject = apimodel._item()
      _lastapiobject.shortdescription = parsedcomment.shortdescription
      _lastapiobject.description = parsedcomment.description
      _lastapiobject.sourcerange.min =  comment.lineinfo.first.offset
      _lastapiobject.sourcerange.max = comment.lineinfo.last.offset
    end

    attachmetadata(_lastapiobject, parsedcomment)

    -- if we create an api object linked it to
    _comment2apiobj[comment] =_lastapiobject
  end

  local function parsecomment(node, parent, ...)
    -- check for comments before this node
    if node.lineinfo and node.lineinfo.first.comments then
      local comments = node.lineinfo.first.comments
      -- check all comments
      for _,comment in ipairs(comments) do
        -- if not already handled
        if not handledcomments[comment] then
          handlecomment(comment)
          handledcomments[comment]=true
        end
      end
    end
    -- check for comments after this node
    if node.lineinfo and node.lineinfo.last.comments then
      local comments = node.lineinfo.last.comments
      -- check all comments
      for _,comment in ipairs(comments) do
        -- if not already handled
        if not handledcomments[comment] then
          handlecomment(comment)
          handledcomments[comment]=true
        end
      end
    end
  end
  Q(ast):filter(function(x) return x.tag~=nil end):foreach(parsecomment)
  return _file, _comment2apiobj
end


function M.extractlocaltype ( commentblock,_file)
  if not commentblock then return nil end

  local stringcomment = commentblock[1]

  local parsedtag = ldp.parseinlinecomment(stringcomment)
  if parsedtag then
    local sourcerangemin = commentblock.lineinfo.first.offset
    local sourcerangemax = commentblock.lineinfo.last.offset

    return createtyperef(parsedtag,_file,sourcerangemin,sourcerangemax), parsedtag.description
  end

  return nil, stringcomment
end

M.generatefunctiontypename = generatefunctiontypename

return M
