local exports = {}
local lang = require('Module:languages').getByCode('pt')

local function makeLink(term, face, allow_self_link)
    local m_links = require('Module:links')
    return m_links.full_link({term = term, lang = lang}, face, allow_self_link)
end

local function verbInformation(verb_data)
    local function verbDescription()
        local description = "這是"
        if verb_data.irregular then
            description = description .. "一個不規則"
        else
            description = description .. "一個規則"
        end
        if verb_data.abundant then description = description .. "完全變化" end
        if verb_data.defective then description = description .. "不完全變化" end
        return description .. "動詞,屬於'''-" .. verb_data.suffix .. "'''結尾動詞。"
    end

    local function verbExamples()
        local examples = {}
        for i, verb in ipairs(verb_data.examples) do
            table.insert(examples,  makeLink(verb, 'term', true))
        end
        return table.concat(examples, ', ')
    end

    local module = string.sub(verb_data.suffix, #verb_data.suffix-1)
    local edit_link = "[".. tostring(mw.uri.fullUrl(
        "Module:pt-conj/data/-"..module, {action='edit'}))
            .." [編輯]]"

    return "'''注''':<sup class='plainlinks'>" .. edit_link .. "</sup>\n"
            .. "* "  .. verbDescription() .. "\n"
            .. "* " .. table.concat(verb_data.comments, "\n* ") .. "\n"
            .. "* 與本動詞變位形式相同的動詞包括:" .. verbExamples() .. "。"
end

local function navHeadText(verb_data)
    return "&nbsp;&nbsp;[[Appendix:" .. lang:getCanonicalName() .. "動詞|" ..
            lang:getCanonicalName() .. " ''-" ..
            verb_data.suffix .. "'' 結尾動詞]] " ..
            "''" .. verb_data.forms.infn.impe .. "'' 的變位"
end

-- main entry point for this module, renders table with all verb forms
function exports.create(verb_data)
    local has_short_pp = verb_data.forms.short_part_past and verb_data.forms.long_part_past
    local function lookup(s)
        local parts = mw.text.split(s, '%.')
        local f = verb_data.forms
        for i, k in ipairs(parts) do
            if f == nil then break end
            f = f[k]
        end
        return f
    end

    local function linkForm(form)
        return makeLink(form, nil, false)
    end

    local function verbForm(param)
        local stdform = lookup(param)
        local text = stdform and stdform ~= '' and linkForm(stdform) or '-'
        local altforms  = lookup(param .. '_alt')
        local defective = lookup(param .. '_defective')
        local obsolete  = lookup(param .. '_obsolete')
        local altobsolete = lookup(param .. '_obsolete_alt')
        if altforms then
            for _, form in ipairs(altforms) do
                text = text .. '<br/>' ..linkForm(form)
            end
        end
        if defective then
            text = text .. "<br/><small>'''一般不完全變化:'''</small><br/>''" .. linkForm(defective) .. "''"
        end
        if obsolete then
            text = text .. "<br/><small>'''棄用:'''</small><br/>''" .. linkForm(obsolete) .. "''"
            end
        if altobsolete then
        	for _, form in ipairs(altobsolete) do
        		text = text .. '<br/>\'\'' ..linkForm(form) .. "''"
        		end
        end
        return text
    end

    local function repl(param)
        if param == 'navhead' then
            return navHeadText(verb_data)
        elseif param == 'verbInformation' then
            return verbInformation(verb_data)
        elseif param then
            return verbForm(param)
        end
    end

    local function pastParticiple()
        if has_short_pp then
            return [=[
! style="border: 1px solid #999999; background:#ffc498" colspan="7" | <span title="particípio irregular">短過去分詞</span><sup><small>[1]</small></sup>
|-
! style="border: 1px solid #999999; background:#dfa478" | 陽性
| style="border: 1px solid #999999; vertical-align: top;" colspan="3" | {{{short_part_past.sing.m}}}
| style="border: 1px solid #999999; vertical-align: top;" colspan="3" | {{{short_part_past.plur.m}}}
|-
! style="border: 1px solid #999999; background:#dfa478" | 陰性
| style="border: 1px solid #999999; vertical-align: top;" colspan="3" | {{{short_part_past.sing.f}}}
| style="border: 1px solid #999999; vertical-align: top;" colspan="3" | {{{short_part_past.plur.f}}}
|-
! style="border: 1px solid #999999; background:#ffc498" colspan="7" | <span title="particípio regular">長過去分詞</span><sup><small>[2]</small></sup>
|-
! style="border: 1px solid #999999; background:#dfa478" | 陽性
| style="border: 1px solid #999999; vertical-align: top;" colspan="3" | {{{long_part_past.sing.m}}}
| style="border: 1px solid #999999; vertical-align: top;" colspan="3" | {{{long_part_past.plur.m}}}
|-
! style="border: 1px solid #999999; background:#dfa478" | 陰性
| style="border: 1px solid #999999; vertical-align: top;" colspan="3" | {{{long_part_past.sing.f}}}
| style="border: 1px solid #999999; vertical-align: top;" colspan="3" | {{{long_part_past.plur.f}}}
]=]
        else
            return [=[
! style="border: 1px solid #999999; background:#ffc498" colspan="7" | <span title="particípio passado">過去分詞</span>
|-
! style="border: 1px solid #999999; background:#dfa478" | 陽性
| style="border: 1px solid #999999; vertical-align: top;" colspan="3" | {{{part_past.sing.m}}}
| style="border: 1px solid #999999; vertical-align: top;" colspan="3" | {{{part_past.plur.m}}}
|-
! style="border: 1px solid #999999; background:#dfa478" | 陰性
| style="border: 1px solid #999999; vertical-align: top;" colspan="3" | {{{part_past.sing.f}}}
| style="border: 1px solid #999999; vertical-align: top;" colspan="3" | {{{part_past.plur.f}}}
]=]
        end
    end

    local wikicode = [=[<div class="NavFrame" style="clear:both; white-space: nowrap">
<div class="NavHead">{{{navhead}}}</div>
<div class="NavContent" align="left">
{| class="inflection-table" style="background:#F6F6F6; text-align: left; border: 1px solid #999999;" cellpadding="3" cellspacing="0"
|-
| style="border: 1px solid #999999;" colspan="7" | {{{verbInformation}}}
|-
! style="border: 1px solid #999999; background:#B0B0B0" rowspan="2" |
! style="border: 1px solid #999999; background:#D0D0D0" colspan="3" | 單數
! style="border: 1px solid #999999; background:#D0D0D0" colspan="3" | 複數
|-
! style="border: 1px solid #999999; background:#D0D0D0; width:12.5%" | 第一人稱<br>([[eu#葡萄牙語|eu]])
! style="border: 1px solid #999999; background:#D0D0D0; width:12.5%" | 第二人稱<br>([[tu#葡萄牙語|tu]])
! style="border: 1px solid #999999; background:#D0D0D0; width:12.5%" | 第三人稱<br>([[ele#葡萄牙語|ele]] / [[ela#葡萄牙語|ela]] / [[você#葡萄牙語|você]])
! style="border: 1px solid #999999; background:#D0D0D0; width:12.5%" | 第一人稱<br>([[nós#葡萄牙語|nós]])
! style="border: 1px solid #999999; background:#D0D0D0; width:12.5%" | 第二人稱<br>([[vós#葡萄牙語|vós]])
! style="border: 1px solid #999999; background:#D0D0D0; width:12.5%" | 第三人稱<br>([[eles#葡萄牙語|eles]] / [[elas#葡萄牙語|elas]] / [[vocês#葡萄牙語|vocês]])
|-
! style="border: 1px solid #999999; background:#c498ff" colspan="7" | <span title="infinitivo">不定式</span>
|-
! style="border: 1px solid #999999; background:#a478df" | '''<span title="infinitivo impessoal">無人稱</span>'''
| style="border: 1px solid #999999; vertical-align: top;" colspan="6" | {{{infn.impe}}}
|-
! style="border: 1px solid #999999; background:#a478df" | '''<span title="infinitivo pessoal">人稱</span>'''
| style="border: 1px solid #999999; vertical-align: top;" | {{{infn.pers.sing.1}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{infn.pers.sing.2}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{infn.pers.sing.3}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{infn.pers.plur.1}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{infn.pers.plur.2}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{infn.pers.plur.3}}}
|-
! style="border: 1px solid #999999; background:#98ffc4" colspan="7" | <span title="gerúndio">動名詞</span>
|-
| style="border: 1px solid #999999; background:#78dfa4" |
| style="border: 1px solid #999999; vertical-align: top;" colspan="6" | {{{part_pres}}}
|-
]=] .. pastParticiple() .. [=[
|-
! style="border: 1px solid #999999; background:#d0dff4" colspan="7" | <span title="indicativo">直陳式</span>
|-
! style="border: 1px solid #999999; background:#b0bfd4" | <span title="presente">現在</span>
| style="border: 1px solid #999999; vertical-align: top;" | {{{indi.pres.sing.1}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{indi.pres.sing.2}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{indi.pres.sing.3}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{indi.pres.plur.1}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{indi.pres.plur.2}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{indi.pres.plur.3}}}
|-
! style="border: 1px solid #999999; background:#b0bfd4" | <span title="pretérito imperfeito">未完成</span>
| style="border: 1px solid #999999; vertical-align: top;" | {{{indi.impf.sing.1}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{indi.impf.sing.2}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{indi.impf.sing.3}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{indi.impf.plur.1}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{indi.impf.plur.2}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{indi.impf.plur.3}}}
|-
! style="border: 1px solid #999999; background:#b0bfd4" | <span title="pretérito perfeito">過去</span>
| style="border: 1px solid #999999; vertical-align: top;" | {{{indi.pret.sing.1}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{indi.pret.sing.2}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{indi.pret.sing.3}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{indi.pret.plur.1}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{indi.pret.plur.2}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{indi.pret.plur.3}}}
|-
! style="border: 1px solid #999999; background:#b0bfd4" | <span title="pretérito mais-que-perfeito simples">過去完成</span>
| style="border: 1px solid #999999; vertical-align: top;" | {{{indi.plpf.sing.1}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{indi.plpf.sing.2}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{indi.plpf.sing.3}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{indi.plpf.plur.1}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{indi.plpf.plur.2}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{indi.plpf.plur.3}}}
|-
! style="border: 1px solid #999999; background:#b0bfd4" | <span title="futuro do presente">將來</span>
| style="border: 1px solid #999999; vertical-align: top;" | {{{indi.futu.sing.1}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{indi.futu.sing.2}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{indi.futu.sing.3}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{indi.futu.plur.1}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{indi.futu.plur.2}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{indi.futu.plur.3}}}
|-
! style="border: 1px solid #999999; background:#ffffaa" colspan="7" | <span title="condicional / futuro do pretérito">條件式</span>
|-
! style="border: 1px solid #999999; background:#ddddaa" |
| style="border: 1px solid #999999; vertical-align: top;" | {{{indi.cond.sing.1}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{indi.cond.sing.2}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{indi.cond.sing.3}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{indi.cond.plur.1}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{indi.cond.plur.2}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{indi.cond.plur.3}}}
|-
! style="border: 1px solid #999999; background:#d0f4d0" colspan="7" | <span title="conjuntivo (pt) / subjuntivo (br)">虛擬式</span>
|-
! style="border: 1px solid #999999; background:#b0d4b0" | <span title=" presente do conjuntivo (pt) / subjuntivo (br)">現在</span>
| style="border: 1px solid #999999; vertical-align: top;" | {{{subj.pres.sing.1}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{subj.pres.sing.2}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{subj.pres.sing.3}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{subj.pres.plur.1}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{subj.pres.plur.2}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{subj.pres.plur.3}}}
|-
! style="border: 1px solid #999999; background:#b0d4b0" | <span title="pretérito imperfeito do conjuntivo (pt) / subjuntivo (br)">未完成</span>
| style="border: 1px solid #999999; vertical-align: top;" | {{{subj.impf.sing.1}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{subj.impf.sing.2}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{subj.impf.sing.3}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{subj.impf.plur.1}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{subj.impf.plur.2}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{subj.impf.plur.3}}}
|-
! style="border: 1px solid #999999; background:#b0d4b0" | <span title="futuro do conjuntivo (pt) / subjuntivo (br)">將來</span>
| style="border: 1px solid #999999; vertical-align: top;" | {{{subj.futu.sing.1}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{subj.futu.sing.2}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{subj.futu.sing.3}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{subj.futu.plur.1}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{subj.futu.plur.2}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{subj.futu.plur.3}}}
|-
! style="border: 1px solid #999999; background:#f4e4d0" colspan="7" | <span title="imperativo">命令式</span>
|-
! style="border: 1px solid #999999; background:#d4c4b0" | <span title="imperativo afirmativo">肯定</span>
| style="border: 1px solid #999999; vertical-align: top;" | {{{impe.affr.sing.1}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{impe.affr.sing.2}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{impe.affr.sing.3}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{impe.affr.plur.1}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{impe.affr.plur.2}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{impe.affr.plur.3}}}
|-
! style="border: 1px solid #999999; background:#d4c4b0" | <span title="imperativo negativo">否定</span> ([[não#葡萄牙語|não]])
| style="border: 1px solid #999999; vertical-align: top;" | {{{impe.negt.sing.1}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{impe.negt.sing.2}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{impe.negt.sing.3}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{impe.negt.plur.1}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{impe.negt.plur.2}}}
| style="border: 1px solid #999999; vertical-align: top;" | {{{impe.negt.plur.3}}}
|}
]=] .. (has_short_pp and [=[
* <sup><small>[1]</small></sup> 通常使用助動詞 [[ser#葡萄牙語|ser]] 和 [[estar#葡萄牙語|estar]];
* <sup><small>[2]</small></sup> 通常使用助動詞 [[haver#葡萄牙語|haver]] 和 [[ter#葡萄牙語|ter]]。
]=] or '') ..
            [=[
            </div>
            </div>]=]
    local replaced, _ = mw.ustring.gsub(wikicode, "{{{([a-zA-Z0-9._]+)}}}", repl)
    return replaced
end

return exports