<?php
/**
 * Created by PhpStorm.
 * User: Игорь
 * Date: 23.01.2017
 * Time: 01:58
 */

namespace PFRM;


class App {

  protected $user_agent;

  protected $user_IP;

  protected $route_table;

  public $dbh;

  public $config;

  function __construct( $config ) {
    $this->config = $config;
    date_default_timezone_set('Europe/Moscow');
    error_reporting(E_ALL);
    $this->user_agent = $_SERVER['HTTP_USER_AGENT'];
    $this->user_IP    = $_SERVER['REMOTE_ADDR'];
    $this->setRoute( '|^/$|', 'Index', 'index' );

    $dsn = 'mysql:host=' . $this->config->db->host
           . ';dbname=' . $this->config->db->dbname . ';charset=utf8';

    try {
      $this->dbh = new \PDO(
        $dsn,
        $this->config->db->user,
        $this->config->db->password
      );
    } catch (\PDOException $exception) {
      die( 'Нет подключения к MySQL: ' . $exception->getMessage() );
    }
  }

  /**
   * Получение useragent пользователя
   *
   * @return string
   */
  public function getUserAgent() {
    return $this->user_agent;
  }

  /**
   * Получение IP пользователя
   *
   * @return string
   */
  public function getUserIP() {
    return $this->user_IP;
  }

  public function getPostObj( $array ) {
    $out = [];
    foreach ( $array as $value ) {
      if ( isset( $_POST[ $value ] ) ) {
        $out[ $value ] = $_POST[ $value ];
      } else {
        $out[ $value ] = false;
      }
    }
    return (object) $out;
  }

  /**
   * Установка маршрута
   *
   * @param string $regexp регулярное выражение описывающее путь
   * @param string $controller котроллер.
   * @param string $action действие. по умолчанию 'index'
   */
  public function setRoute( $regexp, $controller, $action = 'index') {
    $this->route_table[] = array($regexp,$controller,$action);
  }

  /**
   * Редирект
   *
   * @param string $url адрес переброса
   */
  public function Redirect( $url ) {
    header( 'Location: ' . $url );
    exit(0);
  }

  public function routeRun( $controller, $action = 'index', $params = [] ) {
    $a = $this->config->controller_namespace . $controller . 'Controller';
    $obj = new $a;
    call_user_func_array( [ $obj, $action . 'Action' ], $params );
    exit(0);
  }

  /**
   * Запуск приложения
   */
  public function run(){
    foreach ( $this->route_table as $route_array ) {
      if ( preg_match( $route_array[0], $_SERVER['REQUEST_URI'], $matches ) ) {
        $a = $this->config->controller_namespace . $route_array[1] . 'Controller';
        $obj = new $a;
        $param_arr = [];
        foreach ( $matches as $key => $value ) {
          if ( ! is_int( $key ) ) {
            $param_arr[] = $value;
          }
        }
        call_user_func_array( [ $obj, $route_array[2] . 'Action' ], $param_arr );
        break;
      }
    }
  }
}