# Copyright (c) 2023 Nordic Semiconductor ASA
#
# SPDX-License-Identifier: Apache-2.0

import pytest
import textwrap

from unittest import mock
from twister_harness.fixtures.mcumgr import MCUmgr, MCUmgrException


@pytest.fixture(name='mcumgr')
def fixture_mcumgr() -> MCUmgr:
    return MCUmgr.create_for_serial('SERIAL_PORT')


@mock.patch('twister_harness.fixtures.mcumgr.MCUmgr.run_command', return_value='')
def test_if_mcumgr_fixture_generate_proper_command(
    patched_run_command: mock.Mock, mcumgr: MCUmgr
) -> None:
    mcumgr.reset_device()
    patched_run_command.assert_called_with('reset')

    mcumgr.get_image_list()
    patched_run_command.assert_called_with('image list')

    mcumgr.image_upload('/path/to/image', timeout=100)
    patched_run_command.assert_called_with('-t 100 image upload /path/to/image')

    mcumgr.image_test(hash='ABCD')
    patched_run_command.assert_called_with('image test ABCD')

    mcumgr.image_confirm(hash='ABCD')
    patched_run_command.assert_called_with('image confirm ABCD')


def test_if_mcumgr_fixture_raises_exception_when_no_hash_to_test(mcumgr: MCUmgr) -> None:
    cmd_output = textwrap.dedent("""
        Images:
        image=0 slot=0
            version: 0.0.0
            bootable: true
            flags: active confirmed
            hash: 1234
        Split status: N/A (0)
    """)
    mcumgr.run_command = mock.Mock(return_value=cmd_output)
    with pytest.raises(MCUmgrException):
        mcumgr.image_test()


def test_if_mcumgr_fixture_parse_image_list(mcumgr: MCUmgr) -> None:
    cmd_output = textwrap.dedent("""
        Images:
        image=0 slot=0
            version: 0.0.0
            bootable: true
            flags:
            hash: 0000
        image=0 slot=1
            version: 1.1.1
            bootable: true
            flags: pending
            hash: 1111
        Split status: N/A (0)
    """)
    mcumgr.run_command = mock.Mock(return_value=cmd_output)
    image_list = mcumgr.get_image_list()
    assert image_list[0].image == 0
    assert image_list[0].slot == 0
    assert image_list[0].version == '0.0.0'
    assert image_list[0].flags == ''
    assert image_list[0].hash == '0000'
    assert image_list[1].image == 0
    assert image_list[1].slot == 1
    assert image_list[1].version == '1.1.1'
    assert image_list[1].flags == 'pending'
    assert image_list[1].hash == '1111'

    # take second hash to test
    mcumgr.image_test()
    mcumgr.run_command.assert_called_with('image test 1111')

    # take first hash to confirm
    mcumgr.image_confirm()
    mcumgr.run_command.assert_called_with('image confirm 0000')
