module os

struct C.AAsset {
}

struct C.AAssetManager {
}

struct C.ANativeActivity {
	assetManager voidptr
}

fn C.AAssetManager_open(&C.AAssetManager, &char, int) &C.AAsset

fn C.AAsset_getLength(&C.AAsset) int

fn C.AAsset_read(&C.AAsset, voidptr, int) int

fn C.AAsset_close(&C.AAsset)

pub fn read_apk_asset(file string) ?[]byte {
	$if apk {
		act := &C.ANativeActivity(C.sapp_android_get_native_activity())
		if isnil(act) {
			return error('Could not get reference to Android activity')
		}
		asset := C.AAssetManager_open(&C.AAssetManager(act.assetManager), file.str, C.AASSET_MODE_STREAMING)
		if isnil(asset) {
			return error('File `$file` not found')
		}
		len := C.AAsset_getLength(asset)
		buf := []byte{len: len}
		for {
			if C.AAsset_read(asset, buf.data, len) > 0 {
				break
			}
		}
		C.AAsset_close(asset)
		return buf
	} $else {
		return error(@FN + ' can only be used with APK/AAB packaged Android apps')
	}
}