#!/usr/bin/env python3
#
# Copyright (c) 2018, NXP
#
# SPDX-License-Identifier: Apache-2.0

"""Import files from an NXP MCUXpresso SDK archive into Zephyr

The MCUXpresso SDK provides device header files and peripheral drivers for NXP
Kinetis, LPC, and i.MX SoCs. Zephyr drivers for these SoCs are shims that adapt
MCUXpresso SDK APIs to Zephyr APIs.

This script automates updating Zephyr to a newer version of the MCUXpresso SDK.
"""

import argparse
import os
import re
import shutil
import sys
import tempfile

if "ZEPHYR_BASE" not in os.environ:
    sys.stderr.write("$ZEPHYR_BASE environment variable undefined.\n")
    exit(1)

ZEPHYR_BASE = os.environ["ZEPHYR_BASE"]

def get_soc_family(device):
    if device.startswith('MK'):
        return 'kinetis'
    elif device.startswith('LPC'):
        return 'lpc'
    elif device.startswith('MIMX'):
        return 'imx'

def get_files(src, pattern):
    matches = []
    nonmatches = []
    if os.path.exists(src):
        for filename in os.listdir(src):
            path = os.path.join(src, filename)
            if re.search(pattern, filename):
                matches.append(path)
            else:
                nonmatches.append(path)

    return [matches, nonmatches]

def copy_files(files, dst):
    if not files:
        return
    os.makedirs(dst, exist_ok=True)
    for f in files:
        shutil.copy2(f, dst)

def import_sdk(directory):
    devices = os.listdir(os.path.join(directory, 'devices'))
    boards = os.listdir(os.path.join(directory, 'boards'))

    for device in devices:
        family = get_soc_family(device)
        shared_dst = os.path.join(ZEPHYR_BASE, 'ext/hal/nxp/mcux/drivers', family)
        device_dst = os.path.join(ZEPHYR_BASE, 'ext/hal/nxp/mcux/devices', device)

        device_src = os.path.join(directory, 'devices', device)
        device_pattern = "|".join([device, 'fsl_device_registers'])
        [device_headers, ignore] = get_files(device_src, device_pattern)

        drivers_src = os.path.join(directory, 'devices', device, 'drivers')
        drivers_pattern = "fsl_clock|fsl_iomuxc"
        [device_drivers, shared_drivers] = get_files(drivers_src, drivers_pattern)

        xip_boot_src = os.path.join(directory, 'devices', device, 'xip')
        xip_boot_pattern = ".*"
        [xip_boot, ignore] = get_files(xip_boot_src, xip_boot_pattern)

        print('Importing {} device headers to {}'.format(device, device_dst))
        copy_files(device_headers, device_dst)

        print('Importing {} device-specific drivers to {}'.format(device, device_dst))
        copy_files(device_drivers, device_dst)

        print('Importing {} family shared drivers to {}'.format(family, shared_dst))
        copy_files(shared_drivers, shared_dst)

        print('Importing {} xip boot to {}'.format(device, shared_dst))
        copy_files(xip_boot, shared_dst)

    for board in boards:
        board_src = os.path.join(directory, 'boards', board)
        board_dst = os.path.join(ZEPHYR_BASE, 'ext/hal/nxp/mcux/boards', board)

        xip_config_src = os.path.join(board_src, 'xip')
        xip_config_pattern = ".*"
        [xip_config, ignore] = get_files(xip_config_src, xip_config_pattern)

        print('Importing {} xip config to {}'.format(board, board_dst))
        copy_files(xip_config, board_dst)

def parse_args():
    parser = argparse.ArgumentParser(description=__doc__)

    parser.add_argument("-f", "--file", required=True,
                        help="MCUXpresso SDK archive file to import from")

    args = parser.parse_args()

    with tempfile.TemporaryDirectory() as d:
        print('Extracting MCUXpresso SDK into temporary directory {}'.format(d))
        shutil.unpack_archive(args.file, d)
        import_sdk(d)

def main():
    parse_args()

if __name__ == "__main__":
    main()
