#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright (C) 2022 tribe29 GmbH - License: GNU General Public License v2
# This file is part of Checkmk (https://checkmk.com). It is subject to the terms and
# conditions defined in the file COPYING, which is part of this source code package.

from typing import Any, Mapping, Optional, Sequence, Union


def _timeouts(timeouts: Mapping[str, int], arg_prefix: str) -> Sequence[str]:
    args = []
    if (connect := timeouts.get("connect")) is not None:
        args.append(f"--{arg_prefix}-connect-timeout")
        args.append(str(connect))
    if (read := timeouts.get("read")) is not None:
        args.append(f"--{arg_prefix}-read-timeout")
        args.append(str(read))
    return args


def agent_kube_arguments(
    params: Mapping[str, Any], hostname: str, ipaddress: Optional[str]
) -> Sequence[Union[str, tuple[str, str, str]]]:
    args = ["--cluster", params["cluster-name"]]
    args.extend(["--token", passwordstore_get_cmdline("%s", params["token"])])

    args.append("--monitored-objects")
    args.extend(params["monitored-objects"])

    if "namespaces" in params:
        namespace_filter_option, filter_patterns = params["namespaces"]
        for namespace_pattern in filter_patterns:
            args.append(f"--{namespace_filter_option}")
            args.append(namespace_pattern)

    if "cluster-resource-aggregation" in params:
        if params["cluster-resource-aggregation"] == "cluster-aggregation-include-all-nodes":
            args.append("--cluster-aggregation-include-all-nodes")
        else:
            args.append("--cluster-aggregation-exclude-node-roles")
            args.extend(params["cluster-resource-aggregation"][1])
    else:
        args.extend(["--cluster-aggregation-exclude-node-roles", "control-plane", "infra"])

    if (host_labels_param := params.get("import-annotations")) is not None:
        if host_labels_param == "include-annotations-as-host-labels":
            args.append("--include-annotations-as-host-labels")
        else:
            args.append("--include-matching-annotations-as-host-labels")
            args.append(host_labels_param[1])

    api_params = params["kubernetes-api-server"]
    args.extend(["--api-server-endpoint", api_params["endpoint"]])
    if api_params.get("verify-cert"):
        args.append("--verify-cert-api")
    args.extend(
        [
            "--api-server-proxy",
            get_http_proxy(api_params.get("proxy", ("environment", "environment"))).serialize(),
        ]
    )
    if api_timeouts := api_params.get("timeout"):
        args.extend(_timeouts(api_timeouts, "k8s-api"))

    if (collector_params := params.get("cluster-collector")) is None:
        return args

    args.extend(["--cluster-collector-endpoint", collector_params["endpoint"]])
    if collector_params.get("verify-cert"):
        args.append("--verify-cert-collector")
    if collector_timeouts := collector_params.get("timeout"):
        args.extend(_timeouts(collector_timeouts, "cluster-collector"))
    args.extend(
        [
            "--cluster-collector-proxy",
            get_http_proxy(
                collector_params.get("proxy", ("environment", "environment"))
            ).serialize(),
        ]
    )

    return args


special_agent_info["kube"] = agent_kube_arguments
