#!/usr/bin/perl

# **** License ****
#
# Copyright (c) 2018-2020 AT&T Intellectual Property.
#   All Rights Reserved.
#
# SPDX-License-Identifier: GPL-2.0-only
#
#
# **** End License ****

use strict;
use warnings;

use Getopt::Long;
use File::Basename;
use JSON;

use lib "/opt/vyatta/share/perl5";
use Vyatta::Configd;

sub get_login_hash {
    my $c   = Vyatta::Configd::Client->new();
    my $out = $c->tree_get_full_hash("system login user-info");
    return $out->{'user-info'};
}

sub show_user_printf {
    my ($user) = @_;
    my $fmt = "%-30s %-7s %-26s %s\n";
    printf $fmt, "Username", "Type", "Last login", "Password expiry";
    foreach my $u ( @{$user} ) {
        printf $fmt, $u->{'name'}, $u->{'type'}, $u->{'last-login'}, $u->{'password-expiry'};
    }
}

sub show_all {
    my $output = get_login_hash();
    show_user_printf( $output->{'user'} );
}

sub show_vyatta {
    my $output = get_login_hash();
    my $filter = sub {
        my ($u) = @_;
        if ( $u->{'type'} eq 'vyatta' ) {
            return $u;
        }
        return;
    };
    my @filtered = map { $filter->($_) } @{ $output->{'user'} };
    show_user_printf( \@filtered );
}

sub show_locked {
    my $output = get_login_hash();
    my $filter = sub {
        my ($u) = @_;
        if ( $u->{'type'} eq 'locked' ) {
            return $u;
        }
        return;
    };
    my @filtered = map { $filter->($_) } @{ $output->{'user'} };
    show_user_printf( \@filtered );
}

sub show_other {
    my $output = get_login_hash();
    my $filter = sub {
        my ($u) = @_;
        if ( $u->{'type'} eq 'other' ) {
            return $u;
        }
        return;
    };
    my @filtered = map { $filter->($_) } @{ $output->{'user'} };
    show_user_printf( \@filtered );
}

sub call_action_by_name {
    my ( $actions, $script_name, $opt_name, $usage ) = @_;

    my $usagefn = sub {
        printf( "Usage for %s %s:\n", $script_name, $usage );
        printf( "    %s %s --%s=[%s]\n",
            $script_name, $usage, $opt_name, join( "|", keys( %{$actions} ) ) );
        exit(1);
    };

    my ($name);
    GetOptions( "$opt_name=s" => \$name, ) or $usagefn->();
    $usagefn->() unless ( defined($name) );

    my $action = $actions->{$name};
    $usagefn->() unless ( defined($action) );

    return $action->();
}

my %actions = (
    "all"    => \&show_all,
    "vyatta" => \&show_vyatta,
    "locked" => \&show_locked,
    "other"  => \&show_other,
);
call_action_by_name( \%actions, basename($0), "action", "" );
