#include "name_generator.h"

#include <stdio.h>
#include <stdint.h>
#include <furi_hal_rtc.h>
#include <stdlib.h>
#include <stdbool.h>
#include <furi.h>

const char* const name_generator_left[] = {
    "ancient",  "hollow", "strange",   "disappeared", "unknown",    "unthinkable", "unnameable",
    "nameless", "my",     "concealed", "forgotten",   "hidden",     "mysterious",  "obscure",
    "random",   "remote", "uncharted", "undefined",   "untraveled", "untold",
};

const char* const name_generator_right[] = {
    "door",
    "entrance",
    "doorway",
    "entry",
    "portal",
    "entree",
    "opening",
    "crack",
    "access",
    "corridor",
    "passage",
    "port",
};

void name_generator_make_auto(char* name, size_t max_name_size, const char* prefix) {
    if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDetailedFilename)) {
        name_generator_make_detailed(name, max_name_size, prefix);
    } else {
        name_generator_make_random(name, max_name_size);
    }
}

void name_generator_make_random(char* name, size_t max_name_size) {
    furi_assert(name);
    furi_assert(max_name_size);

    uint8_t name_generator_left_i = rand() % COUNT_OF(name_generator_left);
    uint8_t name_generator_right_i = rand() % COUNT_OF(name_generator_right);

    snprintf(
        name,
        max_name_size,
        "%s_%s",
        name_generator_left[name_generator_left_i],
        name_generator_right[name_generator_right_i]);

    // Set first symbol to upper case
    name[0] = name[0] - 0x20;
}

void name_generator_make_detailed(char* name, size_t max_name_size, const char* prefix) {
    furi_assert(name);
    furi_assert(max_name_size);
    furi_assert(prefix);

    FuriHalRtcDateTime dateTime;
    furi_hal_rtc_get_datetime(&dateTime);

    snprintf(
        name,
        max_name_size,
        "%s-%.4d_%.2d_%.2d-%.2d_%.2d",
        prefix,
        dateTime.year,
        dateTime.month,
        dateTime.day,
        dateTime.hour,
        dateTime.minute);
}