import argparse
import tarfile
import os
import io

from utils import DataReader


parser = argparse.ArgumentParser()
parser.add_argument(dest='file', help="APP Packege for open", type=argparse.FileType('rb'))

args = parser.parse_args()
data = DataReader(args.file.read())

data.seek(0, os.SEEK_END)
file_size = data.tell()
data.seek(0)

model = data.read_str(8)
name = data.read_str(64)
data.read(4)
version = data.read_str(32)
data.read(4)
fw_v_1 = data.read_int(4)  # 2
fw_v_2 = data.read_int(4)  # 0  procudt_id
fw_v_3 = data.read_int(4)  # 20 custom_id
fw_v_4 = data.read_int(4)  # 2  model_id
package_version_1 = data.read_int(4)  # OS3 = 0x01 / OS5 = 0x03  # app_id
if package_version_1 == 3:
	package_version_2 = data.read_int(4)  # Additional byte on OS5 (0x01)
data.read(4 * 15)
payload_crc = data.read(4)
payload_size = data.read_int(4)

print("For model:     ", model[:-1])
print("For firmware:  ", f"{fw_v_1}.{fw_v_2}.{fw_v_3}.{fw_v_4}")
print("OS Version:    ", "v3" if package_version_1 == 1 else "v5")
print("APP name:      ", name)
print("APP ver:       ", version)
print("Data CRC:      ", payload_crc.hex().upper())
print("Data size:     ", payload_size)
print("Extracting archive ...")

count = 0
sizes = 0
with tarfile.open(fileobj=data) as f:
	for fd in f:
		# print(f"Extracting {fd.path} ({fd.size})")
		f.extract(fd)
		count += 1
		sizes += fd.size

print("Unpacked files:", count)
print("Unpacked size: ", sizes)
