<?php

class MySQL {

  private _$db;

  public function __construct() {

    try {

      $this->_db = new PDO('mysql:dbname=' . DB_NAME . ';host=' . DB_HOST . ';port=' . DB_PORT . ';charset=utf8', DB_USERNAME, DB_PASSWORD, [PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8']);
      $this->_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      $this->_db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
      $this->_db->setAttribute(PDO::ATTR_TIMEOUT, 600);

    } catch(PDOException $e) {
      trigger_error($e->getMessage());
    }
  }

  public function getNamespaceValueByNS($ns) {

    try {

      $query = $this->_db->prepare('SELECT `data`.`value` AS `value`

                                           FROM `data`
                                           JOIN `namespace` ON (`namespace`.`nameSpaceId` = `data`.`nameSpaceId`)

                                           WHERE `namespace`.`hash` = ?
                                             AND `data`.`ns`        = "1"
                                             -- AND `data`.`deleted`   = "0" --

                                           ORDER BY `data`.`blockId` DESC

                                           LIMIT 1');

      $query->execute([$ns]);

      return $query->rowCount() ? $query->fetch()['value'] : [];

    } catch(PDOException $e) {

      trigger_error($e->getMessage());
      return false;
    }
  }

  public function getNamespaceHashByTX($txid) {

    try {

      $query = $this->_db->prepare('SELECT `namespace`.`hash`

                                           FROM `namespace`
                                           JOIN `data` ON (`data`.`nameSpaceId` = `namespace`.`nameSpaceId`)

                                           WHERE `data`.`txid` = ?');

      $query->execute([$txid]);

      return $query->rowCount() ? $query->fetch()['hash'] : [];

    } catch(PDOException $e) {

      trigger_error($e->getMessage());
      return false;
    }
  }

  public function getData($namehash = false, $txid = false, $search = false, $start = 0, $limit = 10) {

    try {

      if ($txid) {

        $query = $this->_db->prepare('SELECT `block`.`blockId` AS `block`,
                                             `namespace`.`hash` AS `namehash`,
                                             `data`.`time` AS `time`,
                                             `data`.`key` AS `key`,
                                             `data`.`value` AS `value`,
                                             `data`.`txid` AS `txid`

                                             FROM `data`
                                             JOIN `block` ON (`block`.`blockId` = `data`.`blockId`)
                                             JOIN `namespace` ON (`namespace`.`nameSpaceId` = `data`.`nameSpaceId`)

                                             WHERE `data`.`txid`    = ?
                                               AND `data`.`ns`      = "0"
                                               -- AND `data`.`deleted` = "0" --

                                             ORDER BY `block`.`blockId` DESC

                                             LIMIT ' . (int) $start . ',' . (int) $limit);

        $query->execute([$txid]);

      } else if ($namehash) {

        $query = $this->_db->prepare('SELECT `block`.`blockId` AS `block`,
                                             `namespace`.`hash` AS `namehash`,
                                             `data`.`time` AS `time`,
                                             `data`.`key` AS `key`,
                                             `data`.`value` AS `value`,
                                             `data`.`txid` AS `txid`

                                             FROM `data`
                                             JOIN `block` ON (`block`.`blockId` = `data`.`blockId`)
                                             JOIN `namespace` ON (`namespace`.`nameSpaceId` = `data`.`nameSpaceId`)

                                             WHERE `namespace`.`hash` = ?
                                               AND `data`.`ns`        = "0"
                                               -- AND `data`.`deleted`   = "0" --

                                             ORDER BY `block`.`blockId` DESC

                                             LIMIT ' . (int) $start . ',' . (int) $limit);

        $query->execute([$namehash]);

      } else if ($search) {

        $query = $this->_db->prepare('SELECT `block`.`blockId` AS `block`,
                                             `namespace`.`hash` AS `namehash`,
                                             `data`.`time` AS `time`,
                                             `data`.`key` AS `key`,
                                             `data`.`value` AS `value`,
                                             `data`.`txid` AS `txid`

                                             FROM `data`
                                             JOIN `block` ON (`block`.`blockId` = `data`.`blockId`)
                                             JOIN `namespace` ON (`namespace`.`nameSpaceId` = `data`.`nameSpaceId`)

                                             WHERE (`data`.`key`       LIKE :search
                                                OR  `data`.`value`     LIKE :search
                                                OR  `block`.`blockId`  LIKE :search
                                                OR  `namespace`.`hash` LIKE :search
                                                OR  `data`.`txid`      LIKE :search)

                                               AND  `data`.`ns`      = "0"
                                               -- AND  `data`.`deleted` = "0" --

                                             ORDER BY `block`.`blockId` DESC

                                             LIMIT ' . (int) $start . ',' . (int) $limit);

        $query->bindValue(':search', '%' . $search . '%', PDO::PARAM_STR);

        $query->execute();

      } else {

        $query = $this->_db->prepare('SELECT `block`.`blockId` AS `block`,
                                             `namespace`.`hash` AS `namehash`,
                                             `data`.`time` AS `time`,
                                             `data`.`key` AS `key`,
                                             `data`.`value` AS `value`,
                                             `data`.`txid` AS `txid`

                                             FROM `data`
                                             JOIN `block` ON (`block`.`blockId` = `data`.`blockId`)
                                             JOIN `namespace` ON (`namespace`.`nameSpaceId` = `data`.`nameSpaceId`)

                                             WHERE `data`.`ns`      = "0"
                                               -- AND `data`.`deleted` = "0" --

                                             ORDER BY `block`.`blockId` DESC

                                             LIMIT ' . (int) $start . ',' . (int) $limit);

        $query->execute();
      }


      return $query->rowCount() ? $query->fetchAll() : [];

    } catch(PDOException $e) {

      trigger_error($e->getMessage());
      return false;
    }
  }
}