--[[
* qr plugin uses:
* - http://goqr.me/api/doc/create-qr-code/
* psykomantis
]]

function url_encode(str)
  if (str) then
    str = string.gsub (str, "\n", "\r\n")
    str = string.gsub (str, "([^%w %-%_%.%~])",
        function (c) return string.format ("%%%02X", string.byte(c)) end)
    str = string.gsub (str, " ", "+")
  end
  return str
end


function get_hex(str)
  if(string.match(str,"(red)") == "red") then
    return "f00"
  elseif(string.match(str,"(blue)") == "blue") then
    return "00f"
  elseif(string.match(str,"(green)") == "green") then
    return "0f0"
  elseif(string.match(str,"(yellow)") == "yellow") then
    return "ff0"
  elseif(string.match(str,"(purple)") == "purple") then
    return "f0f"
  elseif(string.match(str,"(white)") == "white") then
    return "fff"
  elseif(string.match(str,"(black)") == "black") then
    return "000"
  elseif(string.match(str,"(gray)") == "gray") then
    return "ccc"
  end

  return str
end



do

local function qr(msg, query)

  local receiver = get_receiver(msg)

  local http = require("socket.http")
  local url = "http://api.qrserver.com/v1/create-qr-code/?" .. query .. "&size=600x600"  --fixed size otherways it's low detailed
  local response, code, headers = http.request(url)

  if code ~= 200 then
    return "Oops! Error: " .. code
  end

  if #response > 0 then
	   send_photo_from_url(receiver, url)
	return

  end
  return "Oops! Something strange happened :("
end



local function run(msg, matches)

  local query = ""

  if(#matches == 3) then

    local bgcolor = get_hex(matches[1])
    local color = get_hex(matches[2])
    local data = url_encode(matches[3]:trim())

    query = "data=" .. data .. "&color=" .. color .. "&bgcolor=" .. bgcolor

    return qr(msg, query)

  end

  query = "data=" .. url_encode(matches[1]:trim())

  return qr(msg, query)
end

return {
  description = {"qr code plugin for telegram, given a text it returns the qr code"},
  usage = {
    "/qr [text]",
    '/qr "[background color]" "[data color]" [text]',
    ".......................................................",
    "Color through text: red|green|blue|purple|black|white|gray",
    "Or colors through hex notation: (\"a56729\" is brown)",
    "Or colors through decimals: (\"255-192-203\" is pink)"
  },
  patterns = {
    '^/qr "(.+)" "(.+)" (.+)$',
    "^/qr (.+)$"
  },
  run = run
}

end
