# Copyright (c) 2017 Linaro Limited.
# Copyright (c) 2019 Intel Corporation
#
# SPDX-License-Identifier: Apache-2.0

'''Dediprog (dpcmd) flash only runner for SPI chips.'''

import platform
import subprocess

from runners.core import ZephyrBinaryRunner, RunnerCaps

DPCMD_EXE = 'dpcmd.exe' if platform.system() == 'Windows' else 'dpcmd'
DEFAULT_MAX_RETRIES = 3

class DediProgBinaryRunner(ZephyrBinaryRunner):
    '''Runner front-end for DediProg (dpcmd).'''

    def __init__(self, cfg, spi_image, vcc, retries):
        super(DediProgBinaryRunner, self).__init__(cfg)
        self.spi_image = spi_image
        self.vcc = vcc
        self.dpcmd_retries = retries

    @classmethod
    def name(cls):
        return 'dediprog'

    @classmethod
    def capabilities(cls):
        return RunnerCaps(commands={'flash'})

    @classmethod
    def do_add_parser(cls, parser):
        parser.add_argument('--spi-image', required=True,
                            help='path to SPI image')
        parser.add_argument('--vcc',
                            help='VCC (0=3.5V, 1=2.5V, 2=1.8V)')
        parser.add_argument('--retries', default=5,
                            help='Number of retries (default 5)')

    @classmethod
    def create(cls, cfg, args):
        return DediProgBinaryRunner(cfg,
                                    spi_image=args.spi_image,
                                    vcc=args.vcc,
                                    retries=args.retries)

    def do_run(self, command, **kwargs):
        self.require(DPCMD_EXE)
        cmd_flash = [DPCMD_EXE, '--auto', self.spi_image]

        if self.vcc:
            cmd_flash.append('--vcc')
            cmd_flash.append(self.vcc)

        cmd_flash.append('--silent')
        cmd_flash.append('--verify')

        try:
            max_retries = int(self.dpcmd_retries)
        except ValueError:
            max_retries = DEFAULT_MAX_RETRIES

        retries = 0
        while retries <= max_retries:
            try:
                self.check_call(cmd_flash)
            except subprocess.CalledProcessError as cpe:
                retries += 1
                if retries > max_retries:
                    raise cpe
                else:
                    continue

            break
