1:  2:  3:  4:  5:  6:  7:  8:  9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 
<?php
/**
 * Copyright (C) Marcelle Hövelmanns, art solution - All Rights Reserved
 *
 * @file        Model.php
 * @author      Marcelle Hövelmanns
 * @site        http://www.artsolution.de
 * @date        22.10.17
 */

namespace AffiliconApiClient\Abstracts;


use AffiliconApiClient\Client;
use AffiliconApiClient\Exceptions\ConfigurationInvalid;
use AffiliconApiClient\Interfaces\ModelInterface;
use AffiliconApiClient\Models\Collection;
use AffiliconApiClient\Services\HttpService;

abstract class AbstractModel implements ModelInterface
{
    /** @var string */
    protected $route;

    /** @var Collection */
    protected $rows;

    /** @var Client */
    protected $client;

    public function __construct()
    {
        $this->client = Client::getInstance();
        $this->setRoute();
    }

    /**
     * @param array $body
     * @return HttpService
     */
    protected function post($body)
    {
        return $this->client
            ->http()->post($this->route, $body);
    }

    protected function get()
    {
        return $this->client
            ->http()->get($this->route);
    }

    /**
     * Sets the resource for the model
     * @return string
     * @throws ConfigurationInvalid
     */
    protected function setRoute()
    {
        $class = explode("\\", get_class($this));

        $route = $this->client
            ->config()
            ->get('routes.' . $class[count($class) - 1]);

        if (!is_string($route)) {
            throw new ConfigurationInvalid('Route must be a string');
        }

        $this->route = $route;
    }

    public function findById($id)
    {
        // TODO: Implement findById() method.
    }

    public function find($params, $with)
    {
        // TODO: Implement find() method.
    }

    public function fetch()
    {
        // TODO: Implement all() method.
    }
}