#!/usr/bin/env python3
#
# Copyright (c) 2021, AT&T Intellectual Property.  All Rights Reserved
#
# SPDX-License-Identifier: LGPL-2.1-only

import sys, json
from vyatta import configd
import argparse


def show_one_pps_status(state):
    """
    state:
    {
        "frequency": [{"source": "gps", "weighted-priority": 25}],
        "frequency-status": {
            "operating-status": "Locked",
            "priority": [
                {"source":"bits", "weighted-priority":10},
                {"source":"gps", "weighted-priority":25},
                {"source":"ptp", "weighted-priority":30},
                {"source":"sma", "weighted-priority":20},
                {"source":"synce", "weighted-priority":40},
            ],
            "source": "synce",
        },
        "one-pps-status": {
            "operating-status": "Locked",
            "priority": [
                {"source":"gps-1pps", "weighted-priority":50},
                {"source":"ptp-1pps", "weighted-priority":40},
                {"source":"sma-1pps", "weighted-priority":30},
                {"source":"tod-1pps", "weighted-priority":20},
            ],
            "source": "ptp-1pps",
        },
    }
    """
    try:
        operating_status = state["one-pps-status"]["operating-status"]
        operating_status = operating_status.replace(" ", "-")
        state["one-pps-status"]["priority"] = sorted(state["one-pps-status"]["priority"],
                    key=lambda k: k['weighted-priority'], reverse=True)
        print(f'    1PPS source: {state["one-pps-status"]["source"].upper()}')
        print(f'    1PPS operating-status: {operating_status}')
        print(f'    1PPS priorities:')
        for item in state["one-pps-status"]["priority"]:
            print(f'        {item["weighted-priority"]}: {item["source"].upper()}')
    except:
        pass


def show_frequency_status(state):
    try:
        operating_status = state["frequency-status"]["operating-status"]
        operating_status = operating_status.replace(" ", "-")
        state["frequency-status"]["priority"] = sorted(state["frequency-status"]["priority"],
                    key=lambda k: k['weighted-priority'], reverse=True)
        print(f'    Frequency source: {state["frequency-status"]["source"].upper()}')
        print(f'    Frequency operating-status: {operating_status}')
        print(f'    Frequency priorities:')
        for item in state["frequency-status"]["priority"]:
            print(f'        {item["weighted-priority"]}: {item["source"].upper()}')
    except:
        pass


def get_state_timing_source():
    try:
        c = configd.Client()
    except:
        print("can't connect to configd\n", file=sys.stderr)
        sys.exit(1)

    try:
        d = c.tree_get_full_dict(
            "system timing timing-status timing-source", configd.Client.RUNNING, "json"
        )
    except:
        print("can't retrieve timing-source information\n", file=sys.stderr)
        sys.exit(1)
    # print(f"received from configd:{d}")
    if not bool(d):
        d = {"timing-source": {"one-pps-status": {}, "frequency-status": {}}}
    return d["timing-source"]


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="System timing timing-source show")
    parser.add_argument(
        "-f",
        "--frequency",
        help="Show timing-source frequency status",
        action="store_true",
    )
    parser.add_argument(
        "-p", "--one-pps", help="Show timing-source 1PPS status", action="store_true"
    )

    args = parser.parse_args()
    if args.one_pps:
        state = get_state_timing_source()
        show_one_pps_status(state)

    elif args.frequency:
        state = get_state_timing_source()
        show_frequency_status(state)

    else:
        state = get_state_timing_source()
        show_frequency_status(state)
        show_one_pps_status(state)
