#!/usr/bin/env python
# -*- coding: utf-8 -*-

from __future__ import absolute_import, print_function, unicode_literals

import functools
import json

import click
import requests


def get_metrics(path, yasm):
    response = requests.get("https://api.wall-e.yandex-team.ru/metrics/v1/{path}?format={format}".format(
        path=path, format="yasm" if yasm else "json"))
    return response.json()


def with_format_options():
    json_option = click.option("--json", "format", flag_value="json", help="Show stats in json format (default)")
    yasm_option = click.option("--yasm", "format", flag_value="yasm", help="Show stats in yasm format")
    meta_option = click.option("--meta", "format", flag_value="meta", help="Show some meta about stats")

    def add_format_options(cmd):
        return json_option(yasm_option(meta_option(cmd)))

    return add_format_options


def json_output(cmd):
    @functools.wraps(cmd)
    def json_formatter(*args, **kwargs):
        print(json.dumps(cmd(*args, **kwargs), indent=2))

    return json_formatter


@click.group()
def cli():
    pass


def mk_meta_for_aggregate_metrics(metrics):
    total_project_signals = sum(len(project_signals) for project_signals in metrics["projects"].values())
    return {
        "projects_count": len(metrics["projects"]),
        "signals_per_project": len(metrics["total"]),
        "total_project_signals": total_project_signals,
        "total_signals": total_project_signals + len(metrics["total"]),
    }


@cli.command("tasks")
@with_format_options()
@json_output
def get_task_metrics(format):
    metrics = get_metrics("tasks", yasm=format == "yasm")

    if format == "meta":
        return mk_meta_for_aggregate_metrics(metrics)
    else:
        return metrics


@cli.command("hosts")
@with_format_options()
@json_output
def get_hosts_metrics(format):
    metrics = get_metrics("hosts", yasm=format == "yasm")

    if format == "meta":
        return mk_meta_for_aggregate_metrics(metrics)
    else:
        return metrics


@cli.command("automation")
@with_format_options()
@json_output
def get_hosts_metrics(format):
    metrics = get_metrics("automation", yasm=format == "yasm")

    if format == "meta":
        project_signals_count = sum(len(project_metrics) for project_metrics in metrics["projects"].values())
        automation_plot_signals_count = sum(
            len(check_metrics)
            for checks in metrics["automation_plots"].values()
            for check_metrics in checks.values()
        )

        return {
            "projects_count": len(metrics["projects"]),
            "project_signals_count": project_signals_count,
            "automation_plots_count": len(metrics["automation_plots"]),
            "automation_plot_signals_count": automation_plot_signals_count,
            "total_signals": automation_plot_signals_count + project_signals_count + 2  # two metrics for global status
        }
    else:
        return metrics


if __name__ == "__main__":
    cli()
