require('strict')

local conf = require( "Module:Taxonbar/conf" ) -- configuration module

local p = {}
	
function p.confdoc( frame )
	local wikitable = mw.html.create('table')
	wikitable:addClass('wikitable sortable')
		:tag('caption')
			:wikitext('Taxon identifiers by parameter name')
			:done()
		:tag('tr')
			:tag('th')
				:wikitext('Parameter')
			:tag('th')
				:attr('data-sort-type', 'number')
				:css('white-space', 'nowrap')
				:wikitext('Wikidata ID')
			:tag('th')
				:wikitext('Authority')
			:tag('th')
				:wikitext('Description')
				
				
				
				
	local format = string.format
	
	for _, db in pairs( conf.databases ) do
		local prop = db[3]
		if type(prop) == 'number' and prop > 0 then
			local param = mw.ustring.lower(db[1])
			local row = mw.html.create('tr')
			row
				:tag('td')
					:wikitext(param)
				:tag('td')
					:attr('data-sort-value', prop)
					:wikitext(format('[[d:Property:P%d|P%d]]', prop, prop))
				-- {{#statements:P1629|from=P{{{1|}}}}}
				:tag('td')
					:wikitext(frame:callParserFunction{
						name = '#statements:P1629',
						args = { from = 'P' .. prop }
					})
				:tag('td')
					:wikitext(mw.wikibase.getDescription('P' .. prop))
			wikitable:node(row)
		end
	end
	
	return wikitable
end
--[[ p.wikidataInfo( frame )
    -function to show formatURL and id for taxonomic databases
]]
local COUNTER_MAX = 390
local counter = 0    --expensive parser function counter

function p.wikidataInfo( frame )
	counter = frame.args['counter']  or COUNTER_MAX  -- prevent too many expensive calls
	local start = frame.args['start'] or "a"
	local finish = frame.args['finish'] or "zzz"
	
	local wikitable = '{| class="wikitable sortable"\n' .. 
					  '|-\n' .. 
					  '! Parameter !! Wikidata ID !! Database !! Examples !! datatype !! formatterURL (or alternative) and examples'
	
	for _, db in pairs( conf.databases ) do
		local param = mw.ustring.lower(db[1])
		local link = db[2]
		local prop = db[3]
		local id = 'id'
		local url = 'url'
		local datatype = ""
		local examples = ""
		local links = ""
		local formatterURL = ""
		
		if type(prop) == 'number' and prop > 0 and param > start and param < finish then
			local item = mw.wikibase.getEntity('P'..prop)  --('P5354')
			counter = counter - 1
			
			if item and item ~= "" then
				datatype = item.datatype
				local statements = item:getBestStatements('P1630')[1] 
				if statements and statements.mainsnak and statements.mainsnak.datavalue and statements.mainsnak.datavalue.value then
					formatterURL = statements.mainsnak.datavalue.value
					url = formatterURL
				else
					url = "No formatter URL (P1630)."
					if datatype == "url" then url = url .. " The id of the external database is the url." end
					local subjectItem = item:getBestStatements('P1629')[1]
					if subjectItem then
						local officialWebsite = mw.wikibase.getEntity(subjectItem.mainsnak.datavalue.value.id):getBestStatements('P856')[1]
						counter = counter - 1
						if officialWebsite then	
							url = url .. '<br/>website: ' ..  officialWebsite.mainsnak.datavalue.value
						end
					else
						url = url .. ' or official website (P856) of wikidata item of this property (P1629)'
						-- use third-party formatter URL. e.g for  Euring number (P3459) 
						local statements = item:getBestStatements('P3459')[1] 
						if statements and statements.mainsnak and statements.mainsnak.datavalue and statements.mainsnak.datavalue.value then
				   			local thirdPartyURL = statements.mainsnak.datavalue.value
							url = url ..'<br/>use third party url: ' .. thirdPartyURL
						else
							url = url .. ' or third party formatter url (P3459) '
						end
					end
				end
                examples, links =  p.getExamples( item, prop, formatterURL, datatype )
			end

		
			wikitable = wikitable .. '\n' .. '|-' 
					    .. '\n|' .. param 
					    .. '\n|' .. '[[:d:Property:P' .. prop .. '|P' .. prop .. ']]' 
					    .. '\n|' .. link
					    .. '\n|' .. examples
					    .. '\n|' .. datatype
					    .. '\n|' .. url  .. '\n{{smalldiv|1=' .. links  .. '}}'
		end
	end
	
	return wikitable .. '\n|}'
end

function p.getExamples( propItem , prop, formatterURL, datatype)
	
	
	if counter < 0 then return "count exceeded" end
	
	local examples	= ""	
	local links	= ""	
	local exampleStatements = propItem:getBestStatements('P1855')
	local nExamples = 0
	
	--local statement = statements[1]
	for _, statement in pairs( exampleStatements ) do
		
		if nExamples == 3 then break end -- don't show more than 3 examples
			
		if statement.mainsnak and statement.mainsnak.datavalue and statement.mainsnak.datavalue.value then
			local examplesValue = statement.mainsnak.datavalue.value
			if examplesValue and examplesValue.id then
				local exampleID = examplesValue.id
				--examples = examples .. '\n*[[:d:' .. exampleID  .. '|' .. exampleID ..']] '
				local label = mw.wikibase.getLabel( exampleID )
				examples = examples .. '\n*[[' .. label .. ']] ([[:d:' .. exampleID  .. '|' .. exampleID ..']])'

                -- get information form qualifiers
                if statement.qualifiers then
                   local qualifiers = statement['qualifiers']  
                   local value = qualifiers['P'..prop][1] --['datavalue']['value']
                   --mw.addWarning (mw.wikibase.formatValues( qualifiers ))
                   --mw.addWarning (mw.wikibase.renderSnaks( qualifiers ))
                   -- mw.addWarning (mw.wikibase.formatValue( value ))
                   --mw.addWarning ( mw.wikibase.renderSnak( value ))
                   local id = mw.wikibase.renderSnak( value )
                   examples = examples .. '<br/><small>id=<code>' .. id .. '</code></small>'
                   local link = formatterURL:gsub('$1', id)
                   if (datatype == "url") then link = id end
                   links = links .. '\n*' .. link .. ''
                end


--[==[		    -- this method is expensive as it calls getEntity

		        local item = mw.wikibase.getEntity(exampleID)
		        counter = counter - 1
		        nExamples = nExamples + 1
		        
		        
		        if item and item ~= "" then
					--datatype = item.datatype
					local statements = item:getBestStatements('P225')[1] -- taxon name
					if statements and statements.mainsnak and statements.mainsnak.datavalue and statements.mainsnak.datavalue.value then
						local taxon = statements.mainsnak.datavalue.value
						examples = examples .. ' [[' .. taxon .. ']]'
					end
					local statements = item:getBestStatements('P'..prop)[1] -- the databas property
					if statements and statements.mainsnak and statements.mainsnak.datavalue and statements.mainsnak.datavalue.value then
						local id = statements.mainsnak.datavalue.value
						local link = formatterURL:gsub('$1', id)
						if (datatype == "url") then link = id end
						examples = examples .. ' (' .. id .. ')'  
						links = links .. '\n*' .. link .. ''
					end
		end
]==]
		    else
		    	examples = examples .. "No example"
		    end
		else
			examples = examples .. "No examples statements"
		end
	end

    return examples, links
end
return p