#define _GNU_SOURCE

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <err.h>
#include <pwd.h>
#include <errno.h>
#include "../lpi.h"

void usage(void);
static int handleUser(char *argv[]);
static int handleGroup(char *argv[]);

int
main(int argc, char *argv[])
{
    static int (*func)(char *argv[]);

    if (argc != 4)
        usage();

    if (strcmp(argv[1], "user") == 0)
        func = handleUser;
    else if (strcmp(argv[1], "group") == 0)
        func = handleGroup;

    exit(func(argv+2));
}

static int
handleGroup(char *argv[])
{
    gid_t gid;
    char *name;

    if (strcmp(argv[0], "name") == 0) {
        if ((gid = groupIdFromName(argv[1])) == -1) {
            fprintf(stderr, "no group with this name\n");
            return 1;
        } else {
            printf("%ld\n", (long) gid);
            return 0;
        }
    } else if (strcmp(argv[0], "id") == 0) {
        if ((name = groupNameFromId((gid_t) atoi(argv[1]))) == NULL) {
            fprintf(stderr, "no group with this id\n");
            return 1;
        } else {
            printf("%s\n", name);
            return 0;
        }
    }
}

static int
handleUser(char *argv[])
{
    uid_t uid;
    char *name;

    if (strcmp(argv[0], "name") == 0) {
        if ((uid = userIdFromName(argv[1])) == -1) {
            fprintf(stderr, "no user with this name\n");
            return 1;
        } else {
            printf("%ld\n", (long) uid);
            return 0;
        }
    } else if (strcmp(argv[0], "id") == 0) {
        if ((name = userNameFromId((uid_t) atoi(argv[1]))) == NULL) {
            fprintf(stderr, "no user with this id\n");
            return 1;
        } else {
            printf("%s\n", name);
            return 0;
        }
    } else
        usage();
}

void
usage(void)
{
    errx(EXIT_FAILURE, "usage: %s {user|group} {name|id} name|id",
            program_invocation_short_name);
}
