local reddit = {}

local HTTP = require('socket.http')
local URL = require('socket.url')
local JSON = require('dkjson')
local utilities = require('otouto.utilities')

reddit.command = 'reddit [r/subreddit | query]'

function reddit:init(config)
	reddit.triggers = utilities.triggers(self.info.username, config.cmd_pat, {'^/r/'}):t('reddit', true):t('r', true):t('r/', true).table
	reddit.doc = [[```
]]..config.cmd_pat..[[reddit [r/subreddit | query]
Returns the top posts or results for a given subreddit or query. If no argument is given, returns the top posts from r/all. Querying specific subreddits is not supported.
Aliases: ]]..config.cmd_pat..[[r, /r/subreddit
```]]
end

local format_results = function(posts)
	local output = ''
	for _,v in ipairs(posts) do
		local post = v.data
		local title = post.title:gsub('%[', '('):gsub('%]', ')'):gsub('&', '&')
		if title:len() > 256 then
			title = title:sub(1, 253)
			title = utilities.trim(title) .. '...'
		end
		local short_url = 'redd.it/' .. post.id
		local s = '[' .. title .. '](' .. short_url .. ')'
		if post.domain and not post.is_self and not post.over_18 then
			s = '`[`[' .. post.domain .. '](' .. post.url:gsub('%)', '\\)') .. ')`]` ' .. s
		end
		output = output .. '• ' .. s .. '\n'
	end
	return output
end

reddit.subreddit_url = 'http://www.reddit.com/%s/.json?limit='
reddit.search_url = 'http://www.reddit.com/search.json?q=%s&limit='
reddit.rall_url = 'http://www.reddit.com/.json?limit='

function reddit:action(msg, config)
	-- Eight results in PM, four results elsewhere.
	local limit = 4
	if msg.chat.type == 'private' then
		limit = 8
	end
	local text = msg.text_lower
	if text:match('^/r/.') then
		-- Normalize input so this hack works easily.
		text = msg.text_lower:gsub('^/r/', config.cmd_pat..'r r/')
	end
	local input = utilities.input(text)
	local source, url
	if input then
		if input:match('^r/.') then
			input = utilities.get_word(input, 1)
			url = reddit.subreddit_url:format(input) .. limit
			source = '*/' .. utilities.md_escape(input) .. '*\n'
		else
			input = utilities.input(msg.text)
			source = '*Results for* _' .. utilities.md_escape(input) .. '_ *:*\n'
			input = URL.escape(input)
			url = reddit.search_url:format(input) .. limit
		end
	else
		url = reddit.rall_url .. limit
		source = '*/r/all*\n'
	end
	local jstr, res = HTTP.request(url)
	if res ~= 200 then
		utilities.send_reply(self, msg, config.errors.connection)
	else
		local jdat = JSON.decode(jstr)
		if #jdat.data.children == 0 then
			utilities.send_reply(self, msg, config.errors.results)
		else
			local output = format_results(jdat.data.children)
			output = source .. output
			utilities.send_message(self, msg.chat.id, output, true, nil, true)
		end
	end
end

return reddit