rafaelmonteiro/pokemon-battle-lumen

View on GitHub
app/Http/Controllers/PokemonController.php

Summary

Maintainability
A
1 hr
Test Coverage
A
100%
<?php

namespace App\Http\Controllers;

use App\Exceptions\AttackNotFoundException;
use App\Exceptions\PokemonNotFoundException;
use App\Repositories\AttackRepository;
use App\Repositories\PokemonRepository;
use Illuminate\Http\Request;

class PokemonController extends Controller
{
    private $pokemonRepository;

    public function __construct(PokemonRepository $pokemonRepository)
    {
        $this->pokemonRepository = $pokemonRepository;
    }

    public function all()
    {
        return $this->pokemonRepository->getAll();
    }

    public function select(Request $request)
    {
        $this->validate($request, [
            'name' => 'required'
        ]);

        try {
            $player = $this->pokemonRepository->findByName($request->input('name'));

            return ['player' => $player, 'against' => $this->pokemonRepository->getRandom()];
        } catch (PokemonNotFoundException $e) {
            return response()->json($e->getMessage(), 404);
        }
    }

    public function hit(Request $request)
    {
        $this->validate($request, [
            'player.name' => 'required',
            'player.attack' => 'required',
            'player.currentHealth' => 'required',
            'against.name' => 'required',
            'against.currentHealth' => 'required',
        ]);

        try {
            $player = $this->pokemonRepository->findByName($request->input('player.name'));
            $player->setHealth($request->input('player.currentHealth'));

            $against = $this->pokemonRepository->findByName($request->input('against.name'));
            $against->setHealth($request->input('against.currentHealth'));

            $againstAtkRepository = new AttackRepository($against);
            $randomAgainstAttack = $againstAtkRepository->getRandom();

            $playerAtkRepository = new AttackRepository($player);
            $playerAttack = $playerAtkRepository->findByName($request->input('player.attack'));

        } catch (PokemonNotFoundException $e) {
            return response()->json($e->getMessage(), 404);
        } catch (AttackNotFoundException $e) {
            return response()->json($e->getMessage(), 404);
        }

        $player->hit($playerAttack, $against);
        $against->hit($randomAgainstAttack, $player);

        return [
            'player'=> [
                'name' => $player->getName(),
                'currentHealth' => $player->getHealth(),
                'damage' => $against->getReceivedDamage()->getDamage(),
                'desc' => $against->getReceivedDamage()->getTypeModifier()->getDescription(),
                'desc_id' => $against->getReceivedDamage()->getTypeModifier()->getId(),
            ],
            'against'=>[
                'name' => $against->getName(),
                'currentHealth' => $against->getHealth(),
                'attack' => $player->getReceivedAttack()->getName(),
                'damage' => $player->getReceivedDamage()->getDamage(),
                'desc' => $player->getReceivedDamage()->getTypeModifier()->getDescription(),
                'desc_id' => $player->getReceivedDamage()->getTypeModifier()->getId(),
            ]
        ];
    }
}