# -*- coding:utf-8 -*-
import re
import requests
import demjson
from pprint import pformat, pprint
from urllib.parse import urlencode


def int_overflow(val):
    maxint = 2147483647
    if not -maxint - 1 <= val <= maxint:
        val = (val + (maxint + 1)) % (2 * (maxint + 1)) - maxint - 1
    return val


def ansii(a):
    return a.encode('gbk')


def kr(a: int, b):
    c = 0
    b = ansii(b)
    while c < len(b) - 2:
        d = b[c + 2]
        d = d - 87 if ansii("a")[0] <= d else int(chr(d))
        d = a >> d if ansii("+")[0] == b[c + 1] else a << d
        d = int_overflow(d)
        a = a + d & 4294967295 if ansii("+")[0] == b[c] else a ^ d
        c += 3
    return int_overflow(a)


def mr(q, TKK):
    e = q.encode()
    d = str(TKK).split('.')
    a = int(d[0])
    b = int(d[0])

    for f in e:
        a += f
        a = kr(a, "+-a^+6")
    a = kr(a, "+-3^+b+-f")
    a &= 0xffffffff  # 出错了,转回无符号
    a ^= (int(d[1]) or 0)
    if 0 > a:
        a = (a & 2147483647) + 2147483648
    a %= 1E6
    a = int(a)

    # c = '&tk='
    # return c + (str(a) + "." + str(a ^ b))
    return (str(a) + "." + str(a ^ b))


"""
def Sr(a, TKK):
    a = ''.join(a['a']['b']['q'])
    return mr(a, TKK)
d = {
    'a':{
        'a': ['q'],
        'b': {
            'q': ['me']
        },
        'c': 1,
        'g': 1
    },
    'b': 1,
    'c': None,
    'j': False,
}
TKK = '426151.3141811846'
tk = Sr(d, TKK)
print(tk)
"""

session = requests.session()


def translate(q='hello', source='en', to='zh-CN', tkk=None):
    """
    限制最大5000,按utf-8算,一个汉字算1个,1个英文算一个,超过会失败
    """
    if not tkk:
        tkk = '426151.3141811846'
    tk = mr(q, tkk)
    params = {
        'client': 't',
        'sl': source,
        'tl': to,
        'hl': source,
        'dt': [
            'at', 'qca', 'rw', 'rm', 'ss', 't'
        ],
        'tk': tk,
        'ie': 'UTF-8',
        'oe': 'UTF-8',
        'pc': 1,
        'kc': 1,
        'ssel': 0,
        'otf': 1
    }
    data = {
        'q': q
    }
    headers = {
        'Referer': 'https://translate.google.cn/',
        'Host': 'translate.google.cn',
    }
    resp = requests.post('https://translate.google.cn/translate_a/single', params=params, data=data, headers=headers)
    if resp.status_code == 200:
        resp.encoding = 'utf-8'
        data = resp.json()

        result = []
        result.append(''.join(map(lambda x: x[0], data[0][:-1])))
        result.append(data[0][-1][-1])
        return result
    else:
        return None


def ref_words(q='hello', source='en', to='zh-CN'):
    params = {
        'q': q,
        'client': 'translate-web',
        'ds': 'translate',
        'hl': source,
        'requiredfields': f'tl:{to}',
        'callback': 'window.google.ref_words'
    }
    url = 'https://clients1.google.com/complete/search?'
    headers = {
        'Referer': 'https://translate.google.cn/',
        'Host': 'clients1.google.cn',
    }
    resp = session.get(url, params=params, headers=headers)
    if resp.status_code == 200:
        resp.encoding = 'utf-8'
        result = re.search(r'window.google.ref_words\((.*)\)', resp.text).group(1)
        json_data = demjson.decode(result)
        data_list = list(map(lambda x: x[0], json_data[1]))
        return data_list
    else:
        return None