import pytest
import redfish_requests


def pytest_addoption(parser):
    parser.addoption(
        "--host_addr", action="store", default="https://localhost:4443"
    )
    parser.addoption("--username", action="store", default="root")
    parser.addoption("--password", action="store", default="0penBmc")
    parser.addoption("--metric_limit", action="store", default=200)


@pytest.fixture(scope="session")
def redfish(request):
    host_addr = request.config.getoption("--host_addr")
    username = request.config.getoption("--username")
    password = request.config.getoption("--password")
    return redfish_requests.RedfishRequest(host_addr, username, password)


@pytest.fixture(scope="session")
def telemetry(request, redfish):
    metric_limit = request.config.getoption("--metric_limit")
    return redfish_requests.TelemetryService(redfish, metric_limit)


@pytest.fixture(scope="function")
def report_definitions(redfish):
    report_definitions = redfish_requests.ReportDef(redfish)
    print("Cleaning reports before test")
    for report in report_definitions.get_collection():
        report_definitions.delete_report(report)
    yield report_definitions
    print("Cleaning reports after test")
    for report in report_definitions.get_collection():
        report_definitions.delete_report(report)
