
from os.path import exists, split, splitext
from sys import argv

from urllib.parse import urlunparse
from requests import get, post
from lxml.etree import HTML
namespaces = dict(re="http://e...content-available-to-author-only...t.org/regular-expressions")

from pprint import pprint


extensions = {
    ".c": "C",
    ".cpp": "C++14",
    ".java": "Java7",
    ".pl": "Perl",
    ".php": "PHP",
    ".py": "Python 3",
    ".ruby": "Ruby",
    ".sql": "SQL",
    ".vb": "VB.NET",
    ".go": "GO",
    ".js": "JavaScript (rhino)",
    ".lua": "Lua",
}

def get_ideone(_lang):
    url = "http://i...content-available-to-author-only...e.com/"
    headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36" }
    rs = get(url, headers=headers)
    root = HTML(rs.content if rs.ok else "<error/>")

    data = {}
    for x in root.xpath('//*[re:test(@id,"p[1-3]")]', namespaces=namespaces):
        data[x.get("id")] = x.get("value")

    p2 = int(data["p2"])
    p3 = int(data["p3"])
    p4 = p2 * sum(range(p3))
    data["p4"] = str(p4)

    _langs = {}
    for x in root.xpath('//li/*[re:test(@id,"menu-lang-[0-9]+")]', namespaces=namespaces):
        _langs[x.text.upper()] = int(x.get("data-id"))
    data["_lang"] = _langs[_lang]

    return rs.cookies, data

def ideone(path, _lang=''):
    d, f = split(path)
    n, e = splitext(f)

    if len(_lang) <= 0:
        _lang = "Text"
        if e.lower() in extensions.keys():
            _lang = extensions[e.lower()]

    cookies, data = get_ideone(_lang.upper())

    data.update({
        "input": '',
        "syntax": 1,
        "timelimit": 0,
        "note": '',
        "public": 1,
        "run": 1,
        "Submit": '',
    })

    with open(path, 'r') as ro:
        data["file"] = ro.read()

    url = "http://i...content-available-to-author-only...e.com/ideone/Index/submit/"
    headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36" }
    rs = post(url, headers=headers, cookies=cookies, data=data, allow_redirects=False)

    scheme = "http"
    netloc = "ideone.com"
    path = rs.headers["Location"]
    params = ''
    query = ''
    favorite = ''
    return _lang, urlunparse((scheme, netloc, path, params, query, favorite))

def usage(name):
    print("Usage: ./{} <file1> <file2> ...".format(name))

def main(argc, args):
    if argc == 1:
        d, f = split(__file__)
        usage(f)
    else:
        for i, x in enumerate(args[1:]):
            d, f = split(x)
            _lang, url = ideone(x)
            print(" - #{} ({}): {} - {}".format(i + 1, f, _lang, url))

if __name__ == "__main__":
    main(len(argv), argv)

