#!/usr/bin/env python3
from pathlib import Path
import re, sys, xml.etree.ElementTree as ET

ROOT = Path(__file__).resolve().parents[1]
errors=[]

def req(cond,msg):
    if not cond: errors.append(msg)

gradle=(ROOT/"app/build.gradle.kts").read_text()
req('compileSdk = 36' in gradle, 'compileSdk must remain 36')
req('buildToolsVersion = "36.0.0"' in gradle, 'build tools must remain 36.0.0')
req('val cameraVersion = "1.5.0"' in gradle, 'CameraX must remain 1.5.0')
req('namespace = "com.lemenzo.camera"' in gradle, 'namespace mismatch')
req('applicationId = "com.lemenzo.camera"' in gradle, 'applicationId mismatch')
req('versionCode = 90' in gradle, 'upstream Camera source version code must remain 90')
req('versionName = "1.0"' in gradle, 'Lemenzo display version must be 1.0')

req('resValue("string", "app_name", "Camera")' in gradle,
    'launcher app_name must be Camera')
req('resValue("string", "app_name", "Lemenzo Camera")' not in gradle,
    'launcher app_name must not be Lemenzo Camera')

strings=(ROOT/"app/src/main/res/values/strings.xml").read_text()
req('<string name="lemenzo_camera_name">Lemenzo Camera</string>' in strings,
    'internal Lemenzo Camera product-name string missing')

about=(ROOT/"app/src/main/res/layout/activity_about_lemenzo_camera.xml").read_text()
req('@string/app_name' not in about,
    'About page must not reuse launcher app_name')
req('@string/lemenzo_camera_name' in about,
    'About page must show Lemenzo Camera product name')


manifest=(ROOT/"app/src/main/AndroidManifest.xml").read_text()
req('INTERNET' not in manifest, 'INTERNET permission must not be added')
req('AboutLemenzoCamera' in manifest, 'About activity missing')

# No stale GrapheneOS runtime namespace in compiled source/XML.
for p in list((ROOT/"app/src/main/java").rglob("*")) + list((ROOT/"app/src/main/res").rglob("*.xml")):
    if p.is_file():
        try: t=p.read_text()
        except UnicodeDecodeError: continue
        if 'app.grapheneos.camera' in t:
            errors.append(f'stale GrapheneOS runtime namespace: {p.relative_to(ROOT)}')

# Core upstream classes must exist under Lemenzo namespace.
for rel in [
    "CamConfig.kt",
    "capturer/ImageCapturer.kt",
    "capturer/ImageSaver.kt",
    "capturer/VideoCapturer.kt",
    "ui/activities/MainActivity.kt",
    "analyzer/QRAnalyzer.kt",
]:
    req((ROOT/"app/src/main/java/com/lemenzo/camera"/rel).exists(), f'missing core file: {rel}')

req((ROOT/"app/src/main/res/drawable/lemenzo_camera_logo.png").exists(), 'Lemenzo logo missing')
req('name: "LemenzoCamera"' in (ROOT/"Android.bp").read_text(), 'AOSP import module missing')
req('android_app_import' in (ROOT/"Android.bp").read_text(), 'must use prebuilt import')

bp=(ROOT/"Android.bp").read_text()
req('certificate: "platform"' in bp, 'LemenzoCamera must use platform signing in AOSP')
req('lemenzo_camera_certificate' not in bp, 'stale dedicated Camera certificate reference')


# Parse all resource/manifests.
for p in ROOT.rglob("*.xml"):
    try: ET.parse(p)
    except Exception as e: errors.append(f'XML parse error {p.relative_to(ROOT)}: {e}')


# Locale completeness: English + Danish + German + Swedish + Spanish.
import xml.etree.ElementTree as ET
base_strings = ET.parse(ROOT/"app/src/main/res/values/strings.xml").getroot()
base_names = {e.attrib["name"] for e in base_strings if e.tag == "string"}
for locale in ("da", "de", "sv", "es"):
    lp = ROOT/f"app/src/main/res/values-{locale}/strings.xml"
    req(lp.exists(), f"missing locale file: values-{locale}/strings.xml")
    if lp.exists():
        lr = ET.parse(lp).getroot()
        locale_names = {e.attrib["name"] for e in lr if e.tag == "string"}
        req(locale_names == base_names, f"incomplete locale: {locale}")
        req(all(e.attrib.get("name") != "app_name" for e in lr if e.tag == "string"),
            f"launcher app_name must not be localized in {locale}")

if errors:
    print("LEMENZO CAMERA 90 VALIDATION: FAIL")
    for e in errors: print(" -",e)
    sys.exit(1)

print("LEMENZO CAMERA 90 VALIDATION: PASS")
print("Base: GrapheneOS Camera 90")
print("Android: SDK 36")
print("CameraX: 1.5.0")
print("Package: com.lemenzo.camera")
print("App: Lemenzo Camera")
print("AOSP integration: Gradle APK + android_app_import")
