<?php


/**
 * @param Moon[] $moons
 */
function calculateVelocity(array $moons)
{
    foreach ($moons as $i => $base_moon) {
        foreach ($moons as $j => $target_moon) {
            if ($i === $j) {
                // same planet
                continue;
            }

            $velocity_x = $base_moon->getVelocity()->getX();
            $velocity_y = $base_moon->getVelocity()->getY();
            $velocity_z = $base_moon->getVelocity()->getZ();
            if ($base_moon->getX() > $target_moon->getX()) {
                --$velocity_x;
            } elseif ($base_moon->getX() < $target_moon->getX()) {
                ++$velocity_x;
            }
            if ($base_moon->getY() > $target_moon->getY()) {
                --$velocity_y;
            } elseif ($base_moon->getY() < $target_moon->getY()) {
                ++$velocity_y;
            }
            if ($base_moon->getZ() > $target_moon->getZ()) {
                --$velocity_z;
            } elseif ($base_moon->getZ() < $target_moon->getZ()) {
                ++$velocity_z;
            }
            $base_moon->getVelocity()->setX($velocity_x)->setY($velocity_y)->setZ($velocity_z);
        }
    }
}

/**
 * @param Moon[] $moons
 */
function updateCoordinates(array $moons)
{
    foreach ($moons as $moon) {
        $moon->setX($moon->getX() + $moon->getVelocity()->getX());
        $moon->setY($moon->getY() + $moon->getVelocity()->getY());
        $moon->setZ($moon->getZ() + $moon->getVelocity()->getZ());
    }
}

/**
 * @param Moon[] $moons
 * @return float|int
 */
function calculateEnergy(array $moons)
{
    $energy = 0;
    foreach ($moons as $moon) {
        $pot = abs($moon->getX()) + abs($moon->getY()) + abs($moon->getZ());
        $velocity = $moon->getVelocity();
        $kin = abs($velocity->getX()) + abs($velocity->getY()) + abs($velocity->getZ());
        $energy += $pot * $kin;
    }

    return $energy;
}