# SPDX-License-Identifier: Apache-2.0
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

from pathlib import Path

import pytest
from click.testing import CliRunner
from imgtool.image import Image
from imgtool.main import (
    comp_default_dictsize,
    comp_default_lc,
    comp_default_lp,
    comp_default_pb,
    create_lzma2_header,
    imgtool,
)

VERSION = '2.0.0'
HEADER_SIZE = 0x200
SLOT_SIZE = 0x7a000


@pytest.fixture
def key_file() -> Path:
    return Path(__file__).parents[2] / 'root-ec-p256.pem'


def check_if_compressed(out_file: Path) -> bool:
    # Verify output file. There should be better solution to check
    # if the output file is correctly compressed with lzma2.
    # For now we check only if the output image contains
    # some specific for lzma2 values.
    img = Image(version=VERSION, header_size=HEADER_SIZE, slot_size=SLOT_SIZE, pad_header=True)
    img.load(out_file)
    compression_header = create_lzma2_header(
        dictsize=comp_default_dictsize, pb=comp_default_pb,
        lc=comp_default_lc, lp=comp_default_lp
    )
    return compression_header in img.payload


@pytest.mark.parametrize(
    'compression, compressed',
    [
        ('lzma2', True),
        ('disabled', False)
    ]
)
def test_lzma2_compression(tmpdir: Path, key_file: Path, compression: str, compressed: bool):
    """
    Test if lzma2 compression works by running ``imgtool sign``
    command and checking expected output.
    """
    in_file = tmpdir / 'zephyr.bin'
    with in_file.open("wb") as f:
        f.write(b"hello world\x00\x00\x00\x00\x00" * 64)
    out_file: Path = tmpdir / 'zephyr_signed.bin'

    runner = CliRunner()
    result = runner.invoke(
        imgtool,
        [
            'sign',
            str(in_file),
            str(out_file),
            f'--header-size={HEADER_SIZE}',
            f'--slot-size={SLOT_SIZE}',
            f'--version={VERSION}',
            '--pad-header',
            f'--compression={compression}',
            f'--key={key_file}'
        ],
    )
    assert result.exit_code == 0
    assert out_file.exists()
    assert check_if_compressed(out_file) is compressed
