#!/usr/bin/env python3

"""
Solomon sink for statsite.
"""
import sys
import argparse
import json
import urllib

import requests


def send(url, headers, common_labels, metrics):
    if not metrics:
        return
    sensors = []
    for line in metrics:
        key, val, ts = line.split("|")
        if '.' in key:
            labels = [pair.split('.', 2) for pair in key.split()]
            sensor = '_'.join(labels.pop(-1))
            labels = dict(labels, sensor=sensor)
        else:
            labels = {'sensor': key}
        ts = int(ts)
        val = float(val)
        sensors.append({'labels': labels, 'ts': ts, 'value': val})
    
    urlparams = {}
    for param in 'project', 'cluster', 'service':
        if param in common_labels:
            urlparams[param] = common_labels.pop(param)

    url = '?'.join((url, urllib.parse.urlencode(urlparams)))
    data = {"commonLabels": common_labels, "sensors": sensors}

    headers['Content-Type'] = 'application/json'

    resp = requests.post(url, json=data,
                         headers=headers,
                         timeout=30)
    resp.raise_for_status()


def main():
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument(
        '--solomon-push-url', '-s', metavar='URL',
        default='http://solomon.yandex.net/api/v2/push',
    )
    parser.add_argument('--common-labels', '-c', required=True, metavar='JSON',
                        help='common labels in json syntax')
    parser.add_argument('--headers', '-H', required=False, metavar='JSON')

    args = parser.parse_args()
    common_labels = json.loads(args.common_labels)
    extra_headers = json.loads(args.headers) if args.headers else {}
    send(args.solomon_push_url, extra_headers, common_labels, sys.stdin.read().splitlines())


if __name__ == "__main__":
    main()
