<?php

$pronounsSets = [
    "pony" => [
        "gender" => "ponygender",
        "gender:fr" => "poneygenre",
        "object" => "pony",
        "person" => "pony",
        "possessive_det" => "pony's",
        "possessive_pro" => "pony's",
        "reflexive" => "ponyself",
        "subjective" => "pony",
        "third" => true,
        "color" => "warning"
    ],
    "she" => [
        "gender" => "female",
        "gender:fr" => "fille",
        "object" => "her",
        "person" => "girl",
        "possessive_det" => "her",
        "possessive_pro" => "hers",
        "reflexive" => "herself",
        "subjective" => "she",
        "third" => true,
        "color" => "success"
    ],
    "he" => [
        "gender" => "male",
        "gender:fr" => "garçon",
        "object" => "him",
        "person" => "boy",
        "possessive_det" => "his",
        "possessive_pro" => "his",
        "reflexive" => "himself",
        "subjective" => "he",
        "third" => true,
        "color" => "info"
    ],
    "it" => [
        "gender" => "agender",
        "gender:fr" => "agenre",
        "object" => "it",
        "person" => "person",
        "possessive_det" => "its",
        "possessive_pro" => "its",
        "reflexive" => "itself",
        "subjective" => "it",
        "third" => true,
        "color" => "light"
    ],
    "they" => [
        "gender" => "non binary",
        "gender:fr" => "non binaire",
        "object" => "them",
        "person" => "person",
        "possessive_det" => "their",
        "possessive_pro" => "theirs",
        "reflexive" => "themself",
        "subjective" => "they",
        "third" => false,
        "color" => "primary"
    ]
];

$pronounGetCount = 0;

$possibilitiesPerSet = [];
foreach ($pronounsSets as $name => $set) {
    if (!isset($possibilitiesPerSet[$name])) $possibilitiesPerSet[$name] = [];
    $possibilitiesPerSet[$name][] = $name;

    foreach ($set as $category => $value) {
        if (is_string($value)) $possibilitiesPerSet[$name][] = $value;
    }
}

function getSetFromValue(string $value) {
    global $possibilitiesPerSet;

    foreach ($possibilitiesPerSet as $name => $set) {
        if (in_array($value, $set)) {
            return $name;
        }
    }

    return null;
}

function getPronounsFromMark(?string $mark = null): array {
    if (!isset($mark) || trim($mark) === "") {
        return ["they"];
    } else {
        $parts = array_unique(array_map(function ($i) {
            return getSetFromValue($i);
        }, explode("/", $mark)));
        return $parts;
    }
}

function getMemberPronouns(?string $pronouns): ?array {
    global $pronounsSets;
    $list = getPronounsFromMark($pronouns);
    return $pronounsSets[$list[array_rand($list)]] ?? $pronounsSets["she"];
}

function getGenderFromPronoun(string $pronoun, bool $french = false) {
    global $pronounsSets;
    $set = getPronounsFromMark($pronoun)[0];

    if ($french) {
        return ($pronounsSets[$set] ?? $pronounsSets["they"])["gender:fr"];
    } else {
        return ($pronounsSets[$set] ?? $pronounsSets["they"])["gender"];
    }
}

function pronounInFrench(string $pronoun): string {
    return match ($pronoun) {
        "she" => "elle",
        "her" => "elle",
        "he"  => "il",
        "him" => "lui",
        "they" => "iel",
        "them" => "iel",
        "it" => "iel",
        "its" => "iel",
        "pony" => "poney",
        "pony's" => "à poney",
        "ponys" => "à poney",
        default => $pronoun,
    };
}

function getTooltipsFromMark(string $mark = null, bool $french = false): ?string {
    if (!isset($mark)) {
        return null;
    } else {
        if ($french) {
            return implode("/", array_map(function ($i) {
                return "<span title='" . ucfirst(getGenderFromPronoun($i, true)) . "' data-bs-toggle='tooltip'>" . pronounInFrench($i) . "</span>";
            }, explode("/", $mark)));
        } else {
            return implode("/", array_map(function ($i) {
                return "<span title='" . ucfirst(getGenderFromPronoun($i, false)) . "' data-bs-toggle='tooltip'>" . $i . "</span>";
            }, explode("/", $mark)));
        }
    }
}