import subprocess
import sys
from colorama import init, Fore

init(autoreset=True)

# 定義測項與關聯的屬性與檢查邏輯
TEST_CASES = {
    "a": {
        "name": "L1_MFG data related property (IA113928-5344)",
        "props": [
            "ro.vendor.hon.file.id",
            "ro.vendor.hon.mfg.ver",
            "ro.vendor.hon.wireless.feature",
            "ro.vendor.hon.mm.feature",
            "ro.vendor.hon.odm.num",
            "ro.vendor.hon.bt.addr",
            "ro.vendor.hon.wlan.addr",
            "ro.vendor.hon.imei.num",
            "ro.vendor.hon.meid.num",
            "ro.vendor.hon.model.num",
            "ro.vendor.hon.assembly.date",
            "ro.vendor.hon.extserial.num",
            "ro.vendor.hon.extpart.num",
            "ro.vendor.hon.asset.num",
            "ro.vendor.hon.calibration.magnet",
            "ro.vendor.hon.cal.accel.zero_offset",
            "ro.vendor.hon.cal.gyro.zero_offset"
        ]        
    },
    "b": {
        "name": "L1_Triggered from SMPL (IA113928-5440)",
        "props": ["ro.vendor.hon.reset.reason"],
        "expected": "Triggered from KPD (Power Key Press):cold"
    },
    "c": {
        "name": "L1_Triggered from DC (IA113928-6675)",
        "props": ["ro.vendor.hon.reset.reason"],
        "expected": "Triggered from CBL (External Power Supply):cold"
    },
    "d": {
        "name": "L1_Touch and Panel related property (IA113928-9616)",
        "props": [
            "vendor.touch.module.name",
            "ro.vendor.hon.touch.cfg.ver",
            "ro.vendor.hon.touch.ver.hw",
            "ro.vendor.hon.touch.fw",
            "ro.vendor.hon.touch.module.name",
            "ro.vendor.hon.touch.type",
            "ro.vendor.hon.touch.model",
            "ro.vendor.hon.touch.mode",
            "ro.vendor.hon.panel.name",
            "ro.vendor.hon.panel.cfg"
        ]
    },
    "e": {
        "name": "L1_Configuration Matrix related property (IA113928-9615)",
        "props": [
            "ro.vendor.hon.flat.wwan",
            "ro.vendor.hon.plat.keypad",
            "ro.vendor.hon.plat.imager",
            "ro.vendor.hon.plat.camera",
            "ro.vendor.hon.plat.application",
            "ro.vendor.hon.plat.deploy",
            "ro.vendor.hon.plat.countrycode",
            "ro.vendor.hon.plat.imager.sensor",
            "ro.vendor.hon.plat.memory",
            "ro.vendor.hon.plat.sensor.prx",
            "ro.vendor.hon.plat.sensor.pressure",
            "ro.vendor.hon.plat.dataonly",
            "ro.vendor.hon.plat.simconfig"
        ]
    },
    "f": {
        "name": "L1_long-press 12s power-key (IA113928-4159)",
        "props": ["ro.vendor.hon.reset.reason"],
        "expected": "Triggered from Hard Reset:cold"
    },
    "g": {
        "name": "L1_Triggered from CBL (IA113928-3362)",
        "props": ["ro.vendor.hon.reset.reason"],
        "expected": "Triggered from CBL (External Power Supply):cold"
    },
    "h": {
        "name": "L1_Triggered from Hard Reset (IA113928-3456)",
        "props": ["ro.vendor.hon.reset.reason"],
        "expected": "Triggered from Hard Reset:cold"
    },
    "i": {
        "name": "L1_ro.hsm.hw.rev (IA113928-3606)",
        "props": ["ro.vendor.hon.hw.rev"]
    },
    "j": {
        "name": "L1_user-info (IA113928-4703)",
        "props": ["ro.vendor.build.fingerprint"],
        "length_limit": 96
    },
    "k": {
        "name": "L1_Triggered from USB (IA113928-5014)",
        "props": ["ro.vendor.hon.reset.reason"],
        "expected": "Triggered from USB (USB Charger Insertion):cold"
    },
    "l": {
        "name": "L1_Triggered from KPD (IA113928-5261)",
        "props": ["ro.vendor.hon.reset.reason"],
        "expected": "Triggered from PS_HOLD (PS_HOLD/MSM controlled shutdown):cold"
    },
    "m": {
        "name": "Exit program"
    }
}

def check_device():
    result = subprocess.run(["adb", "devices"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding="utf-8", errors="ignore")
    lines = result.stdout.strip().splitlines()
    if len(lines) <= 1:
        print(Fore.RED + "No ADB device found.")
        return False
    print(Fore.GREEN + f"ADB device connected: {lines[1]}")
    return True

def get_all_props():
    result = subprocess.run(["adb", "shell", "getprop"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding="utf-8", errors="ignore")
    props = {}
    for line in result.stdout.splitlines():
        if line.strip().startswith('['):
            parts = line.strip().split("]: [")
            if len(parts) == 2:
                key = parts[0][1:]
                value = parts[1][:-1]
                props[key] = value
    return props

def show_result(key, value, expected=None, length_limit=None):
    if value is None or value.strip() == "":
        print(Fore.RED + f"{key}: Not Found")
        return

    if expected is not None:
        if value == expected:
            print(Fore.GREEN + f"{key}: {value}")
        else:
            print(Fore.RED + f"{key}: {value}\n(Expected: {expected})")

    elif length_limit is not None:
        if len(value) < length_limit:
            print(Fore.GREEN + f"{key}: {value}")
        else:
            print(Fore.RED + f"{key}: {value} (Length >= {length_limit})")

    else:
        print(Fore.GREEN + f"{key}: {value}")

def run_test(choice, props):
    case = TEST_CASES[choice]
    print(f"\n--- {case['name']} ---")
    for key in case.get("props", []):
        value = props.get(key, "")
        show_result(key, value, case.get("expected"), case.get("length_limit"))

def main():
    if not check_device():
        return
    props = get_all_props()
    while True:
        print("\n選擇測項 a~m：")
        for k, v in TEST_CASES.items():
            print(f"{k}. {v['name']}")
        choice = input("請輸入選項：").lower().strip()
        if choice not in TEST_CASES:
            print(Fore.RED + "無效的選項，請重新輸入。")
            continue
        if choice == "m":
            print("離開程式。")
            break
        run_test(choice, props)

if __name__ == "__main__":
    main()
