#!/usr/bin/env python3
# Version 0.1 by maximalmax90
import requests, json, sys, zipfile, glob, os
from requests.structures import CaseInsensitiveDict
from tkinter import messagebox

_default_client_settings = f"{os.path.expanduser('~')}/.config/VintagestoryData/clientsettings.json"
_mod_dir = ""
_mod_url = ""
_local_mods = []
_local_vers = []
_title="VintageStory 1-click Mod Installer"


def install(_filename, _url, _name, _ver):
	global _mod_dir
	_get = requests.get(_url)
	try:
		with open(f"{_mod_dir}/{_filename}", "wb") as _modfile: _modfile.write(_get.content)
	except Exception as _err:
		messagebox.showerror(title=_title,message=f"An error was encountered while installing {_name} mod!\n\n{_err}")
		sys.exit()
	else: messagebox.showinfo(title=_title,message=f"Version {_ver} of {_name} mod installed successfully!")

def delete(_filename, _ver, _name):
	try: os.remove(_filename)
	except Exception as _err:
		messagebox.showerror(title=_title,message=f"An error was encountered while uninstalling version {_ver} of {_name} mod!\n\n{_err}")
		sys.exit()
	else: messagebox.showinfo(title=_title,message=f"Version {_ver} of {_name} mod uninstalled!")
try:
	with open(_default_client_settings, 'r', encoding='utf-8') as _config_file: _config_data = json.load(_config_file)
except Exception as _err:
	messagebox.showerror(title=_title,message=f"Can't read file: {_err}\n\nMake sure the game has been launched at least once!")
	sys.exit()
else:
	_mod_url = _config_data['stringSettings']['modDbUrl']
	_mod_dir = _config_data['stringListSettings']['modPaths'][1]
	_mod_str = sys.argv[1].split('/')[2]
	_mod_id = _mod_str.split('@')[0]
	_mod_ver = _mod_str.split('@')[1]
	_mod_name = ""
	try:
		_query = CaseInsensitiveDict(requests.get(f"{_mod_url}api/mod/{_mod_id}").json())
		if _query['statuscode'] == "200":
			for _key in _query['mod']['releases']:
				if _key['modversion'] == _mod_ver:
					_get_url = f"https://mods.vintagestory.at/download?fileid={_key['fileid']}"
					_get_file = f"{_key['filename']}".replace(" ", "_")
					_mod_name = _query['mod']['name']
					break
		else:
			messagebox.showerror(title=_title,message=f"Can't parse API!\n\n{_query['statuscode']}")
			sys.exit()
	except Exception as _err:
		messagebox.showerror(title=_title,message=f"Can't parse API!\n\n{_err}")
		sys.exit()
	for _mod in glob.glob(f"{_mod_dir}/*.zip"):
		try:
			with zipfile.ZipFile(_mod, 'r') as _loadfile: _modinfo = CaseInsensitiveDict(json.load(_loadfile.open('modinfo.json')))
		except Exception as _err:
			messagebox.showwarning(title=_title,message=f"Can't get info from {_mod}:\n\n{_err}")
		else:
			if _modinfo.get('modid') == _mod_id:
				_local_vers.append(_modinfo['version'])
				_local_mods.append(_mod)
	if len(_local_vers) > 0:
		if _mod_ver in _local_vers:
			if messagebox.askyesno(title=_title,message=f"Version {_mod_ver} of {_mod_name} mod already installed. Reinstall?"):
				install(_get_file, _get_url, _mod_name, _mod_ver)
				_i = _local_vers.index(_mod_ver)
				del _local_vers[_i]
				del _local_mods[_i]
			else: sys.exit()
		else:
			if messagebox.askyesno(title=_title,message=f"Install version {_mod_ver} of {_mod_name} mod?"): install(_get_file, _get_url, _mod_name, _mod_ver)
			else: sys.exit()
		if len(_local_vers) > 0:
			if messagebox.askyesno(title=_title,message=f"Other versions of {_mod_name} discovered. Show them?"):
				_i = len(_local_mods) - 1
				while _i >= 0:
					if messagebox.askyesno(title=_title,message=f"Uninstall version {_local_vers[_i]} of {_mod_name} mod?"):
						delete(_local_mods[_i],_local_vers[_i],_mod_name)
					_i -= 1
	else:
		if messagebox.askyesno(title=_title,message=f"Install version {_mod_ver} of {_mod_name} mod?"): install(_get_file, _get_url, _mod_name, _mod_ver)
