#!/usr/bin/env -S PYTHONPATH=../../../tools/extract-utils python3
#
# SPDX-FileCopyrightText: 2024 The LineageOS Project
# SPDX-License-Identifier: Apache-2.0
#

from extract_utils.fixups_blob import (
    blob_fixup,
    blob_fixups_user_type,
)
from extract_utils.fixups_lib import (
    lib_fixup_remove,
    lib_fixups,
    lib_fixups_user_type,
)
from extract_utils.main import (
    ExtractUtils,
    ExtractUtilsModule,
)

namespace_imports = [
    'hardware/qcom-caf/wlan',
    'vendor/qcom/opensource/display',
    'vendor/qcom/opensource/commonsys/display',
    'vendor/qcom/opensource/commonsys-intf/display',
]

def lib_fixup_vendor_suffix(lib: str, partition: str, *args, **kwargs):
    return f'{lib}_{partition}' if partition == 'vendor' else None

lib_fixups: lib_fixups_user_type = {
    **lib_fixups,
    (
        'com.qualcomm.qti.dpm.api@1.0',
        'vendor.qti.imsrtpservice@3.0',
        'ibAsusMotorDriverHAL'
        'libxditk_DIT_Manager',
        'libxditk_ISP',
        'libxditk_arch',
        'libxditk_ditArchLIB',
        'libxditk_ditBSP',
        'libxditk_ditBSP_JNI',
        'libxditk_DIT_MSMv1',
    ): lib_fixup_vendor_suffix,
    (
    ): lib_fixup_remove,
}

blob_fixups: blob_fixups_user_type = {
    'system/priv-app/MotorService/MotorService.apk': blob_fixup()
        .apktool_patch('blob-patches/MotorService.patch'),
    ('system/lib64/libxditk_ISP.so',
     'system/lib64/libxditk_ditArchLIB.so'): blob_fixup()
        .replace_needed('libOpenCL.so', 'libOpenCL_system.so'),
    'vendor/etc/msm_irqbalance.conf': blob_fixup()
        .regex_replace('IGNORED_IRQ=27,23,38$', 'IGNORED_IRQ=27,23,38,115,332'),
    'vendor/etc/seccomp_policy/qspm.policy': blob_fixup()
        .add_line_if_missing('gettid: 1'),
    'vendor/bin/hw/android.hardware.camera.provider@2.4-service_64': blob_fixup()
        .add_needed('libhidlbase_shim.so'),
    ('vendor/lib/libreference-ril.so',
     'vendor/lib64/libreference-ril.so'): blob_fixup()
        .add_needed('libbase_shim.so'),
    'vendor/lib64/libvendor.goodix.hardware.biometrics.fingerprint@2.1.so': blob_fixup()
        .replace_needed('libhidltransport.so', 'libhidlbase_shim.so'),
    ('vendor/lib/mediadrm/libwvdrmengine.so',
     'vendor/lib64/mediadrm/libwvdrmengine.so',
     'vendor/lib64/libwvhidl.so'): blob_fixup()
        .patchelf_version('0_17_2')
        .add_needed('libcrypto_shim.so'),
    'vendor/lib64/vendor.qti.hardware.camera.postproc@1.0-service-impl.so': blob_fixup()
        .sig_replace('13 0A 00 94', '1F 20 03 D5'),
    'vendor/lib64/camera/components/com.vidhance.node.processing.so': blob_fixup()
        .replace_needed('libui.so', 'libui-v34.so'),
}  # fmt: skip

module = ExtractUtilsModule(
    'zenfone7',
    'asus',
    blob_fixups=blob_fixups,
    lib_fixups=lib_fixups,
    namespace_imports=namespace_imports,
)

module.add_proprietary_file('proprietary-files-product.txt')
module.add_proprietary_file('proprietary-files-vendor.txt')

if __name__ == '__main__':
    utils = ExtractUtils.device(module)
    utils.run()
