/*
 * FileDummy Sample C File
 * Linked list implementation with memory management.
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_NAME_LEN 100
#define MAX_EMAIL_LEN 255

typedef enum {
    ROLE_ADMIN,
    ROLE_USER,
    ROLE_GUEST
} Role;

typedef struct User {
    int id;
    char name[MAX_NAME_LEN];
    char email[MAX_EMAIL_LEN];
    Role role;
    struct User *next;
} User;

typedef struct {
    User *head;
    int count;
} UserList;

/* ── List operations ───────────────────────── */

UserList *list_create(void) {
    UserList *list = malloc(sizeof(UserList));
    if (list) {
        list->head = NULL;
        list->count = 0;
    }
    return list;
}

int list_append(UserList *list, const char *name, const char *email, Role role) {
    if (!list || !name || !email) return -1;

    User *user = malloc(sizeof(User));
    if (!user) return -1;

    user->id = ++list->count;
    strncpy(user->name, name, MAX_NAME_LEN - 1);
    strncpy(user->email, email, MAX_EMAIL_LEN - 1);
    user->name[MAX_NAME_LEN - 1] = '\0';
    user->email[MAX_EMAIL_LEN - 1] = '\0';
    user->role = role;
    user->next = NULL;

    if (!list->head) {
        list->head = user;
    } else {
        User *cur = list->head;
        while (cur->next) cur = cur->next;
        cur->next = user;
    }
    return user->id;
}

void list_print(const UserList *list) {
    if (!list) return;
    printf("Users (%d):\n", list->count);
    User *cur = list->head;
    while (cur) {
        printf("  [%d] %s <%s> role=%d\n", cur->id, cur->name, cur->email, cur->role);
        cur = cur->next;
    }
}

void list_free(UserList *list) {
    if (!list) return;
    User *cur = list->head;
    while (cur) {
        User *next = cur->next;
        free(cur);
        cur = next;
    }
    free(list);
}

/* ── Entry point ───────────────────────────── */
int main(void) {
    UserList *users = list_create();
    list_append(users, "Alice", "alice@example.com", ROLE_ADMIN);
    list_append(users, "Bob", "bob@example.com", ROLE_USER);
    list_append(users, "Charlie", "charlie@example.com", ROLE_USER);

    list_print(users);
    list_free(users);
    return 0;
}
