<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class NicknameModel extends CI_Model {

    public function __construct() {
        parent::__construct();
    }

    function generateMarkovTable($names = [])
    {
        $table = [];
        foreach ($names as $name) {
            $letters = str_split($name);
            foreach ($letters as $key => $letter) {
                $letter = strtolower($letter);
                if (!array_key_exists($key + 1, $letters)) {
                    continue;
                }
                $nextLetter = strtolower($letters[$key + 1]);
                if (!(array_key_exists($letter, $table) && array_key_exists($nextLetter, $table[$letter]))) {
                    $table[$letter][$nextLetter] = 1;
                    continue;
                }
                $table[$letter][$nextLetter] = $table[$letter][$nextLetter] + 1;
            }
        }
        return $table;
    }

    function generateMarkovName($table, $minLength = 3, $maxLength = 10)
    {
        $currentLetter = array_rand($table);
        $text = [$currentLetter];
        $length = mt_rand($minLength, $maxLength);
        for ($i = 0; $i < $length; $i++) {
            $nextLetter = $this->getRandomWeightedElement($currentLetter, $table);
            if (count($text) > 1) {
                $previousLetter = $text[$i - 1];
                while ($previousLetter == $nextLetter) {
                    $nextLetter = $this->getRandomWeightedElement($currentLetter, $table);
                }
            }
            $text[] = $nextLetter;
            $currentLetter = $nextLetter;
        }
        return ucfirst(implode('', $text));
    }

    function getRandomWeightedElement($key, array $table)
    {
        if (array_key_exists($key, $table)) {
            $weightedValues = $table[$key];
            $rand = mt_rand(1, (int) array_sum($weightedValues));
            foreach ($weightedValues as $key => $value) {
                $rand -= $value;
                if ($rand <= 0) {
                    return $key;
                }
            }
        }
        return array_rand($table);
    }

    public function generateName() {
        $names = [
            'Gronkh',
            'Currywurst',
            'KingOfDog',
            'Zeybe',
            'unge',
            'Dner',
            'Arazhul',
            'Hopson',
            'Carykh',
            'Benx',
            'Demaster',
            'Manucraft',
            'Minecraft',
            'ProPlayer91',
            'Green',
            'Blue',
            'Red',
            'Ultra',
            'Pro',
            'Racing',
            'Shooter',
            'King',
            'Yellow',
            'Gold',
            'xXXx',
            'iTz_',
            'Running',
            'YT',
            'TV',
            'HD',
            'Huge',
            'Best',
            'imFlying',
            'Not'
        ];
        $table = $this->generateMarkovTable($names);
        echo str_pad($this->generateMarkovName($table, 4, 7), 12);
    }
}