import os
import sys
from requests import get
from bs4 import BeautifulSoup
from appPublic.http_client import Http_Client
from appPublic.sockPackage import get_free_local_addr
public_headers = {
	"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3100.0 Safari/537.36"
}

def get_outip():
	ip = get('https://api.ipify.org').content.decode('utf8')
	return ip

def ipip(ip=None):
	# ipip.net
	if ip is None:
		ip = get_outip()
	api= f"http://freeapi.ipip.net/{ip}"
	hc = Http_Client()
	r= hc.get(api, headers=public_headers)
	return {
		'country':r[0],
		'city':r[2]
	}

def ip_api_com(ip):
	url = f'http://ip-api.com/json/{ip}'
	hc = Http_Client()
	r = hc.get(url)
	r['City'] = r['city']
	return r

def iplocation(ip=None):
	if ip is None:
		ip = get_outip()
	# apikey come from
	# https://app.apiary.io/globaliptv/tests/runs
	# using my github accout
	apikey='c675f89c4a0e9315437a1a5edca9b92c'
	api = f"https://www.iplocate.io/api/lookup/{ip}?apikey={apikey}",
	hc = Http_Client()
	r= hc.get(api, headers=public_headers)
	return r

def ipaddress_com(ip=None):
	if ip is None:
		ip = get_outip()
	url = f'https://www.ipaddress.com/ipv4/{ip}'
	print('ipaddress_com(),url=', url)
	hc = Http_Client()
	r = hc.get(url, headers=public_headers)
	bs = BeautifulSoup(r, 'html.parser')
	section = bs.find_all('section')[0]
	trs = section.find_all('tr')
	d = {}
	for tr in trs:
		th = tr.find_all('th')[0]
		td = tr.find_all('td')[0]
		# print(th.contents, td.contents)
		if th.contents[0] == 'IP Latitude':
			d['lat'] = float(td.contents[0].split(' ')[0])
			continue
		if th.contents[0] == 'IP Country':
			# print('ip country:contents[-1]=', td.contents[-1])
			x = td.contents[-1].split('(')[0].strip()
			while x[0] <= ' ' or x[0] >= chr(128):
				x = x[1:]
			d['country'] = x
			continue
		if th.contents[0] == 'IP Longitude':
			d['lon'] = float(td.contents[0].split(' ')[0])
			continue
		if th.contents[0] == 'IP City':
			d['City'] = td.contents[0]
			
	return d

def get_ip_location(ip):
	apis = {
		"ip-api":ip_api_com,
		"ipaddress":ipaddress_com,
		"ipip.net":ipip,
		"iplocation":iplocation,
	}
	hc = Http_Client()
	for k,v in apis.items():
		try:
			r = v(ip)
			return r
		except:
			pass
		
if __name__ == '__main__':
	print(get_free_local_addr())
	if len(sys.argv) > 1:
		info = get_ip_location(sys.argv[1])
		print(info)

