<?php

require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/session.inc"; global $isLoggedIn; global $lang; global $pages; global $isLowerLoggedIn;
require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/pronouns.inc";
require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/functions.inc";
require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/Parsedown.php"; $Parsedown = new Parsedown();

$travelling = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/travelling/travelling.json"), true);

function _header_getMember(string $id, $system) {
    $members = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/$system/members.json"), true);
    $member = null;

    foreach ($members as $m) {
        if ($m["id"] === $id) $member = $m;
    }

    return $member;
}

function getMemberBannerData(string $id, string $system, bool $french = false) {
    global $travelling;
    global $isLoggedIn;
    global $isLowerLoggedIn;
    global $lang;
    global $Parsedown;

    $french = $lang["_french"];

    $member = getSystemMember($system, $id);
    $metadata = file_exists($_SERVER['DOCUMENT_ROOT'] . "/includes/data/metadata/$id.json") ? parseMetadata(json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/metadata/$id.json"), true)) : parseMetadata([
        // FIXME: This doesn't work now that bitset functionality is removed
        "bitset" => 4196352,
        "regression" => null,
        "median" => null,
        "marefriends" => [],
        "sexfriends" => [],
        "sisters" => [],
        "caretakers" => []
    ]);

    $prefixes = [];
    foreach ($member['proxy_tags'] as $proxy) {
        if ($travelling[$member['id']]["travelling"]) {
            if (isset($travelling[$member['id']]['equestria']) && $travelling[$member['id']]['equestria']) {
                $prefixes[] = null;
            } else {
                $prefixes[] = "+" . $proxy["prefix"] . ($proxy["suffix"] !== "" && $proxy["suffix"] !== null ? "..." . $proxy["suffix"] : "");
            }
        } else {
            $prefixes[] = $proxy["prefix"] . ($proxy["suffix"] !== "" && $proxy["suffix"] !== null ? "..." . $proxy["suffix"] : "");
        }
    }

    $lastFronted = null;
    if (!$metadata["median"]) {
        $fronters = array_map(function ($item) {
            return $item["id"];
        }, json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/$system/fronters.json"), true)["members"]);

        if (in_array($id, $fronters)) {
            $lastFronted = [
                'now' => true,
                'relative' => timeAgo(json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/$system/fronters.json"), true)["timestamp"]),
                'absolute' => date("D j M Y, G:i:s (e)", strtotime(json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/$system/fronters.json"), true)["timestamp"])),
                'timestamp' => strtotime(json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/$system/fronters.json"), true)["timestamp"]),
                'duration' => [
                    'seconds' => null,
                    'pretty' => null
                ]
            ];
        } else {
            $switches = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/$system/switches.json"), true);

            $thisMember = array_filter($switches, function ($item) {
                global $memberData;
                return in_array($memberData["id"], $item["members"]);
            });

            $thisMember = array_values($thisMember);
            $frontingEnd = null;

            if (count($thisMember) > 0) {
                $thisIndex = array_search($thisMember[0], $switches);

                $frontingStart = $thisMember[0];
                $frontingEnd = $switches[$thisIndex - 1];
            }

            if ($frontingEnd !== null && isset($frontingStart)) {
                $seconds = (strtotime($frontingEnd["timestamp"]) - strtotime($frontingStart["timestamp"]));

                $lastFronted = [
                    'now' => false,
                    'relative' => timeAgo($frontingEnd["timestamp"]),
                    'absolute' => date("D j M Y, G:i:s (e)", strtotime($frontingEnd["timestamp"])),
                    'timestamp' => strtotime($frontingEnd["timestamp"]),
                    'duration' => [
                        'seconds' => $seconds,
                        'pretty' => $seconds . ($french ? " secondes" : " seconds")
                    ]
                ];
                if ($french) {
                    if ($seconds > 60) {
                        if ($seconds > 3600) {
                            $lastFronted['duration']['pretty'] = round($seconds / 3600) . " heures";
                        } else {
                            $lastFronted['duration']['pretty'] = round($seconds / 60) . " minutes";
                        }
                    }
                } else {
                    if ($seconds > 60) {
                        if ($seconds > 3600) {
                            $lastFronted['duration']['pretty'] = round($seconds / 3600) . " hours";
                        } else {
                            $lastFronted['duration']['pretty'] = round($seconds / 60) . " minutes";
                        }
                    }
                }
            }
        }
    }

    $speciesList = [];
    foreach ($metadata["species"] ?? [] as $species) {
        if ($french) {
            $name = match ($species) {
                "earth" => $metadata["robot"] ? "Robot poney terrestre" : (!$metadata["plush"] ? "Poney terrestre" : "Poney terrestre en peluche"),
                "alicorn" => $metadata["robot"] ? "Robot alicorne" : (!$metadata["plush"] ? "Alicorne" : "Alicorne en peluche"),
                "crystal" => $metadata["robot"] ? "Robot poney de crystal" : (!$metadata["plush"] ? "Poney de crystal" : "Poney de crystal en peluche"),
                "pegasus" => $metadata["robot"] ? "Robot pégase" : (!$metadata["plush"] ? "Pégase" : "Pégase en peluche"),
                "batpony" => $metadata["robot"] ? "Robot Poney chauve souris" : (!$metadata["plush"] ? "Poney chauve souris" : "Poney chauve souris en peluche"),
                "unicorn" => $metadata["robot"] ? "Robot licorne" : (!$metadata["plush"] ? "Licorne" : "Licorne en peluche"),
                "changeling" => "Changelin",
                "merpony" => "Poney sirène",
                default => $species . "_" . $metadata["robot"]
            };
        } else {
            $name = match ($species) {
                "earth" => $metadata["robot"] ? "Robot earth pony" : (!$metadata["plush"] ? "Earth pony" : "Earth pony plush"),
                "alicorn" => $metadata["robot"] ? "Robot alicorn" : (!$metadata["plush"] ? "Alicorn" : "Alicorn plush"),
                "crystal" => $metadata["robot"] ? "Robot crystal pony" : (!$metadata["plush"] ? "Crystal pony" : "Crystal pony plush"),
                "pegasus" => $metadata["robot"] ? "Robot pegasus" : (!$metadata["plush"] ? "Pegasus" : "Pegasus plush"),
                "batpony" => $metadata["robot"] ? "Robot bat pony" : (!$metadata["plush"] ? "Bat pony" : "Bat pony plush"),
                "unicorn" => $metadata["robot"] ? "Robot unicorn" : (!$metadata["plush"] ? "Unicorn" : "Unicorn plush"),
                "changeling" => "Changeling",
                "human" => "Human",
                "merpony" => "Merpony",
                default => $species . "_" . $metadata["robot"]
            };
        }

        $speciesList[] = [
            "id" => $species,
            "name" => $name,
            "robot" => $metadata["robot"],
            "plush" => $metadata["plush"],
            "icon" => $species . ($metadata["robot"] ? "-robot" : ($metadata["plush"] ? "-plush" : "")) . ".png"
        ];
    }

    $app = $GLOBALS["ColdHazeApp"];

    $systemData = [];
    $systemData['page'] = "/" . ($system === "gdapd" ? "raindrops" : ($system === $app["other"]["id"] ? $app["other"]["slug"] : "cloudburst"));
    $systemData['icon'] = getAsset($system);
    $systemData['name'] = $system === "gdapd" ? "Raindrops" : ($system === $app["other"]["id"] ? $app["other"]["short"] : "Cloudburst");
    $systemData['full_name'] = $system === "gdapd" ? "Raindrops System" : ($system === $app["other"]["id"] ? $app["other"]["name"] : "Cloudburst System");
    $systemData['temporary'] = false;

    if ($travelling[$member['id']]["travelling"] && !$travelling[$member['id']]["equestria"]) {
        $systemData['page'] = "/" . ($system === "gdapd" ? "cloudburst" : "raindrops");
        $systemData['icon'] = getAsset($system === "gdapd" ? "ynmuc" : "gdapd");
        $systemData['name'] = $system === "gdapd" ? "Cloudburst" : "Raindrops";
        $systemData['full_name'] = $system === "gdapd" ? "Cloudburst System" : "Raindrops System";
        $systemData['temporary'] = true;
    }

    if ($travelling[$member['id']]["travelling"] && $travelling[$member['id']]["equestria"]) {
        $systemData['page'] = null;
        $systemData['icon'] = "/assets/logo/equestria.png";
        $systemData['name'] = "Equestria";
        $systemData['full_name'] = "Equestria";
        $systemData['temporary'] = true;
    }

    $marefriends = [];
    foreach ($metadata["marefriends"] as $marefriend) {
        $mfSystem = explode("/", $marefriend)[0];
        $mfMemberID = explode("/", $marefriend)[1];
        $mfMember = array_filter(json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/$mfSystem/members.json"), true), function ($item) use ($mfMemberID) {
            return $item["id"] === $mfMemberID;
        });
        sort($mfMember);
        $mfMember = $mfMember[0];

        if (!($mfSystem === $app["other"]["id"] && !$isLoggedIn && !$isLowerLoggedIn)) $marefriends[] = [
            "id" => $marefriend,
            "link" => "/" . ($mfMember["name"]),
            "icon" => getAsset($mfSystem, $mfMemberID, "heads"),
            "name" => $mfMember["display_name"] ?? $mfMember["name"],
            "full_name" => $mfMember["display_name"] ?? $mfMember["name"]
        ];
    }

    $sexfriends = null;

    if ($isLoggedIn) {
        $sexfriends = [];
        foreach ($metadata["sexfriends"] as $marefriend) {
            $mfSystem = explode("/", $marefriend)[0];
            $mfMemberID = explode("/", $marefriend)[1];
            $mfMember = array_filter(json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/$mfSystem/members.json"), true), function ($item) use ($mfMemberID) {
                return $item["id"] === $mfMemberID;
            });
            sort($mfMember);
            $mfMember = $mfMember[0];

            if (!($mfSystem === $app["other"]["id"] && !$isLoggedIn && !$isLowerLoggedIn)) $sexfriends[] = [
                "id" => $marefriend,
                "link" => "/" . ($mfMember["name"]),
                "icon" => getAsset($mfSystem, $mfMemberID, "heads"),
                "name" => $mfMember["display_name"] ?? $mfMember["name"],
                "full_name" => $mfMember["display_name"] ?? $mfMember["name"]
            ];
        }
    }

    $sisters = [];
    foreach ($metadata["sisters"] as $marefriend) {
        $mfSystem = explode("/", $marefriend)[0];
        $mfMemberID = explode("/", $marefriend)[1];
        $mfMember = array_filter(json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/$mfSystem/members.json"), true), function ($item) use ($mfMemberID) {
            return $item["id"] === $mfMemberID;
        });
        sort($mfMember);
        $mfMember = $mfMember[0];

        if (!($mfSystem === $app["other"]["id"] && !$isLoggedIn && !$isLowerLoggedIn)) $sisters[] = [
            "id" => $marefriend,
            "link" => "/" . ($mfMember["name"]),
            "icon" => getAsset($mfSystem, $mfMemberID, "heads"),
            "name" => $mfMember["display_name"] ?? $mfMember["name"],
            "full_name" => $mfMember["display_name"] ?? $mfMember["name"]
        ];
    }

    $friends = [];
    foreach ($metadata["friends"] ?? [] as $marefriend) {
        $mfSystem = explode("/", $marefriend)[0];
        $mfMemberID = explode("/", $marefriend)[1];
        $mfMember = array_filter(json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/$mfSystem/members.json"), true), function ($item) use ($mfMemberID) {
            return $item["id"] === $mfMemberID;
        });
        sort($mfMember);
        $mfMember = $mfMember[0];

        if (!($mfSystem === $app["other"]["id"] && !$isLoggedIn && !$isLowerLoggedIn)) $friends[] = [
            "id" => $marefriend,
            "link" => "/" . ($mfMember["name"]),
            "icon" => getAsset($mfSystem, $mfMemberID, "heads"),
            "name" => $mfMember["display_name"] ?? $mfMember["name"],
            "full_name" => $mfMember["display_name"] ?? $mfMember["name"]
        ];
    }

    $caretakers = null;

    if ($metadata["little"] >= 2) {
        $caretakers = [];
        foreach ($metadata["caretakers"] as $marefriend) {
            $mfSystem = explode("/", $marefriend)[0];
            $mfMemberID = explode("/", $marefriend)[1];
            $mfMember = array_filter(json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/$mfSystem/members.json"), true), function ($item) use ($mfMemberID) {
                return $item["id"] === $mfMemberID;
            });
            sort($mfMember);
            $mfMember = $mfMember[0];

            if (!($mfSystem === $app["other"]["id"] && !$isLoggedIn && !$isLowerLoggedIn)) $caretakers[] = [
                "id" => $marefriend,
                "link" => "/" . ($mfMember["name"]),
                "icon" => getAsset($mfSystem, $mfMemberID, "heads"),
                "name" => $mfMember["display_name"] ?? $mfMember["name"],
                "full_name" => $mfMember["display_name"] ?? $mfMember["name"]
            ];
        }
    }

    $badges = [];

    if ($metadata["fictive"] ?? false) {
        $badges[] = [
            "id" => "fictive",
            "color" => "info",
            "html" => '<span data-bs-toggle="tooltip" data-bs-html="true" title="<b>Equestrian</b><br>' . ucfirst(getMemberPronouns($member['pronouns'])["subjective"]) . ' ' . (getMemberPronouns($member['pronouns'])["third"] ? "is" : "are") . ' based on the personality, look and behavior of a character that is from Equestria." class="badge rounded-pill bg-info" style="height: 24px;"><img style="width: 16px;" src="/assets/logo/equestria.png"><span style="vertical-align: middle;">&nbsp;Equestrian</span></span>'
        ];
    }

    if ($metadata["fictive2"] ?? false) {
        $badges[] = [
            "id" => "fictive2",
            "color" => "d63384",
            "html" => '<span data-bs-toggle="tooltip" data-bs-html="true" title="<b>Fictive</b><br>' . ucfirst(getMemberPronouns($member['pronouns'])["subjective"]) . ' ' . (getMemberPronouns($member['pronouns'])["third"] ? "is" : "are") . ' based on the personality, look and behavior of a character that is from Celeste." class="badge rounded-pill" style="height: 24px;background-color: #d63384;"><img style="width: 16px;" src="/assets/logo/celeste.png"><span style="vertical-align: middle;">&nbsp;Fictive</span></span>'
        ];
    }

    if ($metadata["persecutor"] ?? false) {
        $badges[] = [
            "id" => "persecutor",
            "color" => "danger",
            "html" => '<span data-bs-toggle="tooltip" data-bs-html="true" title="<b>Persecutor</b><br>' . ucfirst(getMemberPronouns($member['pronouns'])["subjective"]) . ' ' . (getMemberPronouns($member['pronouns'])["third"] ? "acts" : "act") . ' harmfully towards other system members and/or others, potentially as a misguided attempt to protect the system." class="badge rounded-pill bg-danger" style="height:24px;display: inline-flex;align-items: center;position: relative;top: 1px;"><span>Persecutor</span></span>'
        ];
    }

    if ($metadata["less_frequent"] ?? false) {
        $badges[] = [
            "id" => "nonverbal",
            "color" => "#6610f2",
            "html" => '<span data-bs-toggle="tooltip" data-bs-html="true" title="<b>Fronts less often</b><br>' . ucfirst(getMemberPronouns($member['pronouns'])["subjective"]) . ' ' . (getMemberPronouns($member['pronouns'])["third"] ? "front" : "fronts") . ' less often than ' . getMemberPronouns($member['pronouns'])["possessive_det"] . ' headmates, this can be due to various reasons." class="badge rounded-pill" style="background-color:#6610f2;height:24px;display: inline-flex;align-items: center;position: relative;top: 1px;"><span>Fronts less often</span></span>'
        ];
    }

    if ($metadata["nonverbal"] ?? false) {
        $badges[] = [
            "id" => "nonverbal",
            "color" => "#20c997",
            "html" => '<span data-bs-toggle="tooltip" data-bs-html="true" title="<b>Non verbal IRL</b><br>' . ucfirst(getMemberPronouns($member['pronouns'])["subjective"]) . ' ' . (getMemberPronouns($member['pronouns'])["third"] ? "is" : "are") . ' non verbal in real life, although text communication is still possible." class="badge rounded-pill" style="background-color:#20c997;height:24px;display: inline-flex;align-items: center;position: relative;top: 1px;"><span>Non verbal IRL</span></span>'
        ];
    }

    if ($member["name"] === "fusion") {
        $badges[] = [
            "id" => "fusion",
            "color" => "333333",
            "html" => '<span data-bs-toggle="tooltip" data-bs-html="true" title="<b>Fusion</b><br>She is the result of multiple ponies purposefully merging in a way that makes them impossible to tell apart." class="badge rounded-pill" style="background-color:#333333;height:24px;display: inline-flex;align-items: center;position: relative;top: 1px;"><span>Fusion</span></span>'
        ];
    }

    if (($metadata["host"] ?? false)) {
        $badges[] = [
            "id" => "host",
            "color" => "fc6735",
            "html" => '<span data-bs-toggle="tooltip" data-bs-html="true" title="<b>Host</b><br>' . ucfirst(getMemberPronouns($member['pronouns'])["subjective"]) . ' ' . (getMemberPronouns($member['pronouns'])["third"] ? "is" : "are") . ' the host in ' . getMemberPronouns($member['pronouns'])["possessive_det"] . ' system." class="badge rounded-pill" style="background-color:#fc6735;height:24px;display:inline-flex;align-items:center;position:relative;top:1px;"><span>Host</span></span>'
        ];
    }

    if (($metadata["leader"] ?? false)) {
        $badges[] = [
            "id" => "leader",
            "color" => "d6a833",
            "html" => '<span data-bs-toggle="tooltip" data-bs-html="true" title="<b>Leader</b><br>' . ucfirst(getMemberPronouns($member['pronouns'])["subjective"]) . ' ' . (getMemberPronouns($member['pronouns'])["third"] ? "is" : "are") . ' a leader in ' . getMemberPronouns($member['pronouns'])["possessive_det"] . ' system." class="badge rounded-pill" style="background-color:#fd7e14;height:24px;display: inline-flex;align-items: center;position: relative;top: 1px;"><span>Leader</span></span>'
        ];
    }

    if ($metadata["protector"] ?? false) {
        $badges[] = [
            "id" => "protector",
            "color" => "black",
            "html" => '<span style="height:24px;display: inline-flex;align-items: center;position: relative;top: 1px;" data-bs-toggle="tooltip" data-bs-html="true" title="<b>Protector</b><br>' . ucfirst(getMemberPronouns($member['pronouns'])["subjective"]) . ' ' . (getMemberPronouns($member['pronouns'])["third"] ? "is" : "are") . ' a protector in the system and will front when somepony cannot handle it anymore." class="badge rounded-pill bg-black"><span>Protector</span></span>'
        ];
    }

    if (($metadata["little"] ?? 0) === 2) {
        $badges[] = [
            "id" => "little",
            "color" => "success",
            "html" => '<span style="height:24px;display: inline-flex;align-items: center;position: relative;top: 1px;" data-bs-toggle="tooltip" data-bs-html="true" title="<b>Little</b><br>' . ucfirst(getMemberPronouns($member['pronouns'])["subjective"]) . ' ' . (getMemberPronouns($member['pronouns'])["third"] ? "is" : "are") . ' mentally younger, and therefore behaves and feels younger than the body is." class="badge rounded-pill bg-success"><span>Little</span></span>'
        ];
    }

    if (($metadata["little"] ?? 0) === 3) {
        $badges[] = [
            "id" => "younger",
            "color" => "dark",
            "html" => '<span style="height:24px;display: inline-flex;align-items: center;position: relative;top: 1px;" data-bs-toggle="tooltip" data-bs-html="true" title="<b>Younger</b><br>' . ucfirst(getMemberPronouns($member['pronouns'])["subjective"]) . ' ' . (getMemberPronouns($member['pronouns'])["third"] ? "is" : "are") . ' younger than the body, but not young enough to be classified as a little." class="badge rounded-pill bg-dark"><span>Younger</span></span>'
        ];
    }

    if (($isLoggedIn || $isLowerLoggedIn) && isset($metadata["alcohol"]) && $metadata["alcohol"] !== false) {
        $badges[] = [
            "id" => "alcohol",
            "color" => "secondary",
            "html" => '<span style="height:24px;display: inline-flex;align-items: center;position: relative;top: 1px;" data-bs-toggle="tooltip" data-bs-html="true" title="<b>Alcohol</b><br>' . ucfirst(getMemberPronouns($member['pronouns'])["subjective"]) . ' drinks alcohol, and thus may be drunk or hungover at times." class="badge rounded-pill bg-secondary"><span>Alcohol</span></span>'
        ];
    }

    return [
        'id' => $member['name'],
        'color' => $member["color"] ?? "000000",
        'icon' => [
            "online" => getAsset($system, $member["id"]),
            "offline" => "pf-$system-$id.webp"
        ],
        'median' => $metadata["median"],
        'little' => $metadata["little"] >= 2,
        'name' => $member["display_name"] ?? $member["name"],
        'gender' => isset($metadata["gender"]) && trim($metadata["gender"]) !== "" ? $Parsedown->text($metadata["gender"]) : "Agender",
        'badges' => $badges,
        'prefixes' => $prefixes,
        'pronouns' => isset($member["pronouns"]) && trim($member["pronouns"]) !== "" ? $member["pronouns"] : "<i>they/them</i>",
        'pronouns_usage' => getMemberPronouns($member['pronouns']),
        'last_fronted' => $lastFronted,
        'species' => $speciesList,
        'system' => $systemData,
        'relations' => [
            'marefriends' => $marefriends ?? [],
            'sexfriends' => $sexfriends ?? null,
            'sisters' => $sisters ?? [],
            'caretakers' => $caretakers ?? [],
            'friends' => $friends ?? []
        ]
    ];
}