#!/usr/bin/env python3
############################################################################
# tools/ci/testrun/script/conftest.py
#
# SPDX-License-Identifier: Apache-2.0
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.  The
# ASF licenses this file to you 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.
#
############################################################################
# encoding: utf-8

import pytest
from utils.common import connectNuttx


def pytest_addoption(parser):
    parser.addoption(
        "-D",
        action="store",
        default=None,
        help="specify device, for example: /dev/ttyUSB0",
    )
    parser.addoption(
        "-B", action="store", default="sim", help="specify board, for example: sim"
    )
    parser.addoption(
        "-P",
        action="store",
        default=None,
        help="specify vela path, for example: /home/root/vela",
    )
    parser.addoption(
        "-F",
        action="store",
        default="/data",
        help="specify filesystem, for example: /data or /tmp",
    )
    parser.addoption(
        "-L",
        action="store",
        default=None,
        help="specify log path, for example: /home/root/vela/logs",
    )
    parser.addoption("-O", action="store", default=None, help="specify ota version")
    parser.addoption(
        "-S", action="store_true", default=False, help="enable sudo as run sim"
    )
    parser.addoption(
        "-C", action="store_true", default=False, help="enable pre-checkin run"
    )
    parser.addoption(
        "-U",
        action="store",
        default=None,
        help="specify core: ap, audio, cp, sensor, tee",
    )
    parser.addoption(
        "-M",
        action="store",
        default="minicom",
        help="serial open method:serial or minicom",
    )
    parser.addoption(
        "-R",
        action="store",
        default="sim",
        help="specify the target type: target|qemu|sim|module, default is sim",
    )


@pytest.fixture(scope="session")
def get_option(pytestconfig):
    dev = pytestconfig.getoption("-D")
    board = pytestconfig.getoption("-B")
    vela_path = pytestconfig.getoption("-P")
    fs = pytestconfig.getoption("-F")
    log_path = pytestconfig.getoption("-L")
    ota_version = pytestconfig.getoption("-O")
    sudo = pytestconfig.getoption("-S")
    ci = pytestconfig.getoption("-C")
    core = pytestconfig.getoption("-U")
    method = pytestconfig.getoption("-M")
    target = pytestconfig.getoption("-R")
    yield dev, board, vela_path, fs, log_path, ota_version, core, sudo, ci, method, target


@pytest.fixture(scope="session", name="p")
def connect_nuttx_session(get_option):
    (
        dev,
        board,
        vela_path,
        fs,
        log_path,
        ota_version,
        core,
        sudo,
        ci,
        method,
        target,
    ) = get_option
    print(get_option)
    p = connectNuttx(
        board, vela_path, dev, log_path, fs, ota_version, core, sudo, ci, method, target
    )
    p.setup()
    yield p
    p.cleanup()


@pytest.fixture(scope="function", autouse=True)
def do_free_ps(request, p):
    if "disable_autouse" in request.keywords:
        yield
    else:
        yield
        p.sendCommand("free", "total", flag=">")
        p.sendCommand("ps", "PID", flag=">")
        p.sendCommand("ls %s" % p.fs, flag=">")


@pytest.fixture(scope="function", name="pp")
def connect_nuttx_function(get_option):
    (
        dev,
        board,
        vela_path,
        fs,
        log_path,
        ota_version,
        core,
        sudo,
        ci,
        method,
        target,
    ) = get_option
    print(get_option)
    p = connectNuttx(
        board, vela_path, dev, log_path, fs, ota_version, core, sudo, ci, method, target
    )
    p.setup()
    yield p
    # p.cleanup()