<?php
if(!isset($_SESSION)){session_start();}
include('coneccao-bd.php');

// Bypass para developer
if(DEVELOPER){
  $_SESSION['usuario_id']     = "1";
  $_SESSION['usuario_login']  = "leandro";
  $_SESSION['usuario_nome']   = "Leandro";
  $_SESSION['usuario_nivel']  = 1;
  header('Location: index.php');
  exit;
}

if(isset($_POST['acesso']) && $_POST['acesso'] === 'login'){

  $erro_mensagem = '';

  if(empty($_POST['login'])){ $erro_mensagem = 'Campo Login está vazio';
  }elseif(empty($_POST['senha'])){ $erro_mensagem = 'Campo Senha está vazio';
  }elseif(empty($_POST['code'])){ $erro_mensagem = 'Campo Código está vazio';
  }else{
    $login = trim($_POST['login']);
    $senha = $_POST['senha'];
    $code  = $_POST['code'];

    $sql = $bd->getConexao()->prepare('SELECT id, nome, nivel, login, senha, senha_hash, tk_auth FROM usuarios uss WHERE uss.login = :login AND uss.status = 1 AND uss.excluido = 0 AND uss.tk_auth IS NOT NULL');
    $sql->bindValue(':login', $login, PDO::PARAM_STR);
    if($sql->execute()){ $usuario = $sql->fetch(PDO::FETCH_ASSOC);}

    if(!$usuario){ $erro_mensagem = 'Credenciais inválidas';
    }else{
      // VALIDAR SENHA
      $senha_valida = false;

      // Formato novo Hash Argon2id
      if(!empty($usuario['senha_hash'])){
        $senha_valida = password_verify($senha, $usuario['senha_hash']);
      }
      // Se ainda no formato md5
      elseif(!empty($usuario['senha']) && md5($senha) === $usuario['senha']){
        $senha_valida = true;
        $senha_hash = password_hash($senha, PASSWORD_ARGON2I, ['memory_cost'=>65536,'time_cost'=>4,'threads'=>4]);

        $sql = $bd->getConexao()->prepare('UPDATE usuarios SET senha_hash = :senha_hash WHERE id = :id');
        $sql->bindValue(':id', $usuario['id'], PDO::PARAM_STR);
        $sql->bindValue(':senha_hash', $senha_hash, PDO::PARAM_STR);
        $sql->execute();

        $sql = $bd->getConexao()->prepare('UPDATE usuarios_suporte SET senha_hash = :senha_hash WHERE login = :login');
        $sql->bindValue(':login', $usuario['login'], PDO::PARAM_STR);
        $sql->bindValue(':senha_hash', $senha_hash, PDO::PARAM_STR);
        $sql->execute();
      }

      if(!$senha_valida){ $erro_mensagem = 'Credenciais inválidas';
      }else{
        include_once '../_vendors/google-authenticator/FixedBitNotation.php';
        include_once '../_vendors/google-authenticator/GoogleAuthenticatorInterface.php';
        include_once '../_vendors/google-authenticator/GoogleAuthenticator.php';
        include_once '../_vendors/google-authenticator/GoogleQrUrl.php';
        $auth = new \Google\Authenticator\GoogleAuthenticator();

        if(!DEVELOPER && !$auth->checkCode($usuario['tk_auth'], $code)){
          $erro_mensagem = 'Credenciais inválidas';
        }else{
          $_SESSION['usuario_id']     = $usuario['id'];
          $_SESSION['usuario_login']  = $login;
          $_SESSION['usuario_nome']   = $usuario['nome'];
          $_SESSION['usuario_nivel']  = $usuario['nivel'];

          header('Location: index.php');
          exit;
        }
      }
    }
  }
}
?>