# Unless explicitly stated otherwise all files in this repository are licensed under the BSD-3-Clause License.
# This product includes software developed at Datadog (https://www.datadoghq.com/).
# Copyright 2015-Present Datadog, Inc
# stdlib
from collections import defaultdict

# datadog
from datadog import api
from datadog.dogshell.common import report_errors, report_warnings


class MetricClient(object):
    @classmethod
    def setup_parser(cls, subparsers):
        parser = subparsers.add_parser("metric", help="Post metrics.")
        verb_parsers = parser.add_subparsers(title="Verbs", dest="verb")
        verb_parsers.required = True

        post_parser = verb_parsers.add_parser("post", help="Post metrics")
        post_parser.add_argument("name", help="metric name")
        post_parser.add_argument("value", help="metric value (integer or decimal value)", type=float)
        post_parser.add_argument(
            "--host", help="scopes your metric to a specific host " "(default to the local host name)", default=""
        )
        post_parser.add_argument(
            "--no_host", help="no host is associated with the metric" " (overrides --host))", action="store_true"
        )
        post_parser.add_argument("--device", help="scopes your metric to a specific device", default=None)
        post_parser.add_argument("--tags", help="comma-separated list of tags", default=None)
        post_parser.add_argument(
            "--localhostname",
            help="deprecated, used to force `--host`"
            " to the local hostname "
            "(now default when no `--host` is specified)",
            action="store_true",
        )
        post_parser.add_argument(
            "--type", help="type of the metric - gauge(32bit float)" " or counter(64bit integer)", default=None
        )
        parser.set_defaults(func=cls._post)

    @classmethod
    def _post(cls, args):
        """
        Post a metric.
        """
        # Format parameters
        api._timeout = args.timeout

        host = None if args.no_host else args.host

        if args.tags:
            tags = sorted(set([t.strip() for t in args.tags.split(",") if t]))
        else:
            tags = None

        # Submit metric
        res = api.Metric.send(
            metric=args.name, points=args.value, host=host, device=args.device, tags=tags, metric_type=args.type
        )

        # Report
        res = defaultdict(list, res)

        if args.localhostname:
            # Warn about`--localhostname` command line flag deprecation
            res["warnings"].append(
                u"`--localhostname` command line flag is deprecated, made default when no `--host` "
                u"is specified. See the `--host` option for more information."
            )
        report_warnings(res)
        report_errors(res)
