<?php

use Behat\Behat\Tester\Exception\PendingException;
use Behat\Behat\Context\Context;
use Behat\MinkExtension\Context\MinkContext;
use Behat\Behat\Context\SnippetAcceptingContext;
use Behat\Gherkin\Node\PyStringNode;
use Behat\Gherkin\Node\TableNode;
use GuzzleHttp\Client;

/**
 * Defines application features from the specific context.
 */
class SegundoExercicioContext extends MinkContext implements Context, SnippetAcceptingContext
{
    public $client;
    public $apiResponse;

    /**
     * Initializes context.
     */
    public function __construct()
    {
        $this->client = new Client([
            'base_uri' => 'http://api.postmon.com.br/v1/cep/',
            'timeout'    => 2.0,
            'exceptions' => false
        ]);
    }

    /**
     * @Given que requisito uma busca pelo cep :numeroCep
     * @Given que requisito uma busca sem passar um cep
     */
    public function queRequisitoUmaBuscaPeloCep($numeroCep = "")
    {
        $this->apiResponse = $this->client->request('GET', $numeroCep, ['http_errors' => false]);
    }

    /**
     * @Then devo ter o status :statusCode
     */
    public function devoTerOStatus($statusCode)
    {
        \PHPUnit_Framework_Assert::assertEquals($statusCode, $this->apiResponse->getStatusCode());
    }

    /**
     * @Then devo ter o :campo como :dado
     */
    public function devoTerOComo($campo, $dado)
    {
        $apiResponse = json_decode($this->apiResponse->getBody(), true);
        \PHPUnit_Framework_Assert::assertEquals($dado, $apiResponse[$campo]);
    }

    /**
     * @Then as seguintes informações do estado:
     */
    public function asSeguintesInformacoesDoEstado(TableNode $infoEstado)
    {
        $apiResponse = json_decode($this->apiResponse->getBody(), true);
        foreach ($infoEstado as $linha) {
            $dado = $apiResponse["estado_info"][$linha['informacao']];
            \PHPUnit_Framework_Assert::assertEquals($linha['dado'], $dado);
        }
    }

    /**
     * @Then as seguintes informações da cidade:
     */
    public function asSeguintesInformacoesDaCidade(TableNode $infoCidade)
    {
        $apiResponse = json_decode($this->apiResponse->getBody(), true);
        foreach ($infoCidade as $linha) {
            $dado = $apiResponse["cidade_info"][$linha['informacao']];
            \PHPUnit_Framework_Assert::assertEquals($linha['dado'], $dado);
        }
    }
}