<?php
/**
 * @copyright (c) Kufer Software GmbH, Loisachstrasse 4, D-84453 Mühldorf
 */

if (!defined('BASEDIR')) {
  include_once '..' . DIRECTORY_SEPARATOR . 'constants.php';
}


class DBWorkToolsLoginError extends DBWorkGenerated
{
  public function __construct($pDBTyp = 1, $pNewInstance = false)
  {
    parent::__construct($pDBTyp, $pNewInstance);
    $this->select = 'id, iphash, anzahl_versuche, letzter_fehlversuch';
    $this->_dataModulFields = array('letzter_fehlversuch', 'anzahl_versuche', 'iphash', 'id');
  }

  
  public function getNewObject()
  {
    return new ToolsLoginError();
  }

  public function getTableName(): string
  {
    return 'web_tools_login_error';
  }

  public function getByIpHash($pIpHash)
  {
    $cleanIpHash = $this->dboperation->getString4Sql($pIpHash);

    $sql = 'SELECT ' . $this->select
           . ' FROM ' . $this->getTableName()
           . ' WHERE iphash like \'' . $cleanIpHash . '\''
           . ' ORDER BY id DESC';
    $this->dboperation->clear();
    $this->dboperation->query($sql);

    return $this->getFirstRow();
  }

  
  public function useCaptcha4CurrentIp($refreshCache = false)
  {
    static $useCaptcha = null;
    if (is_null($useCaptcha) || $refreshCache) {
      $useCaptcha = false;

      $hashedIp = ToolsLoginError::getIpHashByIp($_SERVER['REMOTE_ADDR']);
      $loginVersuchFehlerhaft = $this->getByIpHash($hashedIp);

      if ($loginVersuchFehlerhaft->id > -1 && $loginVersuchFehlerhaft->isYoungerThan24Hours()) {
        $useCaptcha = true;
      }
    }

    return $useCaptcha;
  }

  
  public function merkeFehlversuch4CurrentIp()
  {
    $hashedIp = ToolsLoginError::getIpHashByIp($_SERVER['REMOTE_ADDR']);
    $loginVersuchFehlerhaft = $this->getByIpHash($hashedIp);
    if ($loginVersuchFehlerhaft->id > -1) {
      if ($loginVersuchFehlerhaft->isYoungerThan24Hours()) {
        $loginVersuchFehlerhaft->anzahl_versuche += 1;
        
        $loginVersuchFehlerhaft->letzter_fehlversuch = DateTimeOperations::getDateTimeNow();
      } else {
        $loginVersuchFehlerhaft->anzahl_versuche = 1;
        $loginVersuchFehlerhaft->letzter_fehlversuch = DateTimeOperations::getDateTimeNow();
      }
      $this->updateLoginversuch($loginVersuchFehlerhaft);
    } else {
      $loginVersuchFehlerhaft->anzahl_versuche = 1;
      $loginVersuchFehlerhaft->iphash = $hashedIp;
      $loginVersuchFehlerhaft->letzter_fehlversuch = DateTimeOperations::getDateTimeNow();
      $this->insertLoginVersuch($loginVersuchFehlerhaft);
    }
  }

  public function insertLoginversuch($pToolsLoginversuchFehlerhaft)
  {
    $pToolsLoginversuchFehlerhaft->id = $this->insertRecord($this->getTableName(), 'id', 'iphash');
    
    $orgToolsLoginversuchFehlerhaf = $this->getOneNoFilter($pToolsLoginversuchFehlerhaft->id);

    $this->updateObject($pToolsLoginversuchFehlerhaft, $orgToolsLoginversuchFehlerhaf, $this->getTableName(), 'id', 'A', true);
    $this->setActionIDs();

    return $pToolsLoginversuchFehlerhaft->id;
  }

  public function updateLoginversuch($pToolsLoginversuchFehlerhaft)
  {
    if (isset($pToolsLoginversuchFehlerhaft->id) && $pToolsLoginversuchFehlerhaft->id > -1) {
      $orgObj = $this->getOneNoFilter($pToolsLoginversuchFehlerhaft->id);
      $this->updateObject($pToolsLoginversuchFehlerhaft, $orgObj, $this->getTableName(), 'id', 'U', true);
    }
    $this->setActionIDs();
  }
}