#!/usr/bin/env python
#
# Copyright 2021 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""A wrapper script for flashing combined bootloader image"""

import argparse
import os
import subprocess
import sys
import time

MODE_UPDATE = "update"
MODE_FASTBOOT = "fastboot"


def parse_args():
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument("image", help="path to the combined bootloader image")
    parser.add_argument("mode",
                        choices=[MODE_UPDATE, MODE_FASTBOOT],
                        help="flash mode")
    parser.add_argument("--update_tool",
                        "-u",
                        help="path to the amlogic usb update executable")
    return parser.parse_args()


def update(update_tool, image):
    subprocess.check_call(
        [update_tool, "write", image, "0xfffa0000", "0x10000"])
    subprocess.check_call([update_tool, "run", "0xfffa0000"])
    subprocess.check_call([update_tool, "bl2_boot", image])
    print("Waiting TPL plug-in...")
    time.sleep(7)
    subprocess.check_call([update_tool, "partition", "bootloader", image])


def fastboot(image):
    subprocess.check_call(["fastboot", "flash", "bootloader", image])


def main():
    args = parse_args()
    update_tool = args.update_tool if args.update_tool else "update"
    if args.mode == MODE_UPDATE:
        update(update_tool, args.image)
    elif args.mode == MODE_FASTBOOT:
        fastboot(args.image)
    return 0


if __name__ == "__main__":
    sys.exit(main())
