import json
import hashlib
import requests
import sys

def descargar(mani):
	print(f"Leyendo archivo...: {mani}")
	with open(mani, 'r') as f:
		datos_mani = json.loads(f.read().replace('",\n"verificacion"', '",\n"verificacion"'))

		try:
			nombre_archivo = datos_mani["nombre"]
			total_partes = datos_mani["partes"]
			base_url = datos_mani["base"]
			hash_esperado = datos_mani["verificacion"]
		except:
			print("Error al procesar el archivo {mani}!!!")
			return False

	print(f"Listo para descargar '{nombre_archivo}' (Partes: {total_partes})...")

	with open(nombre_archivo, 'wb') as archivo_final:
		for i in range(1, total_partes + 1):
			url_chunk = f"{base_url}test.mkv.parte{i}"
			print(f"\r[{'-' * i}{' ' * int(total_partes-i)}] [{i}/{total_partes}]", end="")
			respuesta = requests.get(url_chunk, stream=True)
			if respuesta.status_code == 200:
				for chunk in respuesta.iter_content(chunk_size=1024 * 1024):
					archivo_final.write(chunk)
			else:
				print(f"Error: Se ha fallado la descarga en la parte  {i}. Codigo: {respuesta.status_code}")
				return False

	print(" [OK] Comprobando archivo...",end="")
	sha256_hash = hashlib.sha256()
	with open(nombre_archivo, "rb") as f:
		for byte_block in iter(lambda: f.read(4096), b""):
			sha256_hash.update(byte_block)
	hash_calculado = sha256_hash.hexdigest()
	if hash_calculado == hash_esperado:
		print(f"'{nombre_archivo}' ha sido descargado, unido y comprobado con exito.")
		return True
	else:
		print("ERROR AL VERIFICAR EL HASH! El archivo probablemente esta corrupto.")
		print(f"Hash esperado:        {hash_esperado}")
		print(f"Hash generado:        {hash_calculado}")
		return False

if __name__ == "__main__":
    descargar(sys.argv[1])
