#!/usr/bin/env python3

# Copyright (c) 2021, AT&T Intellectual Property.
# All rights reserved.
#
# SPDX-License-Identifier: LGPL-2.1-only

from argparse import ArgumentParser
from vyatta import configd
import sys

arg_parser = ArgumentParser()
arg_parser.add_argument("--status", help="Get device status",
                        action="store_true")
args = arg_parser.parse_args()


def sfp_approved(device):
    if device['state'] == 'approved':
        return "Approved"
    else:
        return "Unapproved"


def sfp_enabled(device):
    if device['action'] == 'disabled':
        return "Disabled"
    else:
        return "Monitor"


def sfp_mode(obj):
    if obj == 'enabled':
        return "Enforcement"
    else:
        return "Monitor"


# Converts string to sum of ASCII chars and digits
def alphanum_total(s):
    val = 0
    digits = ""

    for c in s:
        if c.isalpha():
            val += ord(c)
        else:
            digits += c

    if digits:
        val += int(digits)

    return val


output_format = "{:20}{:17}{:17}{:10}{:6}{:12}{:10}"


def print_device(device):
    print(output_format.format(device['interface-name'],
                               device['part'],
                               device['vendor'],
                               device['oui'],
                               device['revision'],
                               sfp_approved(device),
                               sfp_enabled(device)))


def show_sfp_permit_status():
    """
    Show sfp permit-list status.
    """
    cfg = configd.Client()
    try:
        obj = cfg.call_rpc_dict("vyatta-system-sfp-v1",
                                "get-sfp-permit-list-status", {})
    except Exception as e:
        print("Error retrieving SFP permit list status : {}\n", format(e))
        sys.exit(1)

    if not obj:
        return

    print()
    print("Mode: {}".format(sfp_mode(obj['enforcement-mode'])))
    print()
    print(output_format.format("Interface", "Part-id", "Vendor",
                               "OUI", "Rev", "Status", "Action"))
    print()
    devices = sorted(obj['sfp-list'],
                     key=lambda dev: alphanum_total(dev['interface-name']))
    for device in devices:
        print_device(device)


if args.status:
    show_sfp_permit_status()
