<?php

require_once 'connect.php';
require_once '../inc/messages.php';

define('SESSION_USER_NAME', 'loggedUser');

// retorna array com lista de módulos, ou false se deu erro
function usuarios_getAll() {
  global $conexao;
  $sql = 'select * from erpc_usuarios where 1=?';
  $values[] = '1';
  $result = _prepareAndQuery($sql, $values);
  return $result;
}

// retorna array associativo com objeto, ou false se deu erro/não encontrar
function usuarios_getById($id) {
  global $conexao;
  $sql = 'select * from erpc_usuarios where id=? and st_ativo=1';
  $values[] = $id;
  $result = _prepareAndQuery($sql, $values);
  if ($result !== false) {
    if (count($result) === 1) {
      $result = $result[0];
    } else {
      $result = false;
      addError('Id não encontrado ' . $id);
    }
  }

  return $result;
}

// insere novo módulo
function usuarios_insert($usuarios, &$error=null) {
  global $conexao;
  $ok = true;

  // verificações de senha
  if (strlen($usuarios['ds_senha']) < 5) {
    if ($error === null) {
      addMessage('Senha deve ter no mínimo 5 caracteres');
    } else {
      $error = 'Senha deve ter no mínimo 5 caracteres';
    }
    $ok = false;
  }
  if ($ok && $usuarios['ds_senha'] !== $usuarios['ds_senha2']) {
    if ($error === null) {
      addMessage('A primeira e a segunda senha estão diferentes');
    } else {
      $error = 'A primeira e a segunda senha estão diferentes';
    }
    $ok = false;
  }

  // verifica se existe o usuário já cadastrado
  if ($ok) {
    $sql = "select 1 as erro from erpc_usuarios where ds_email=?";
    $values[] = $usuarios['ds_email'];
    $result = _prepareAndQuery($sql, $values);
    if ($result !== false) {
      if (count($result) !== 0) {
        addError('E-mail já cadastrado para outro usuário');
        $ok = false;
      }
    }
  }

  if ($ok) {
    $sql = 'insert into erpc_usuarios ';
    $campos = array('ds_email', 'ds_senha', 'ds_nome', 'id_grupo', 'st_bloqueado', 'ds_cep', 'ds_uf', 'ds_bairro', 'ds_endereco', 'ds_cpf', 'ds_rg', 'st_ativo');
    $values = array();
    $usuarios['ds_senha'] = password_hash($usuarios['ds_senha'], PASSWORD_DEFAULT);
    foreach($campos as $campo) {
      $values[] = $usuarios[$campo];
    }
    // verifica se mandou nova imagem de perfil válida e adiciona nos arrays de campos e valores
    $ds_foto = usuarios_handle_uploads();
    if ($ds_foto !== false) {
      $campos[] = 'ds_foto';
      $values[] = $ds_foto;
    }
    $sql .= '(' . implode(',', $campos) . ') values (' . trim(str_repeat('?,', count($values)), ',') . ')';

    $ok = _prepareAndExecute($sql, $values, $error);
    if ($ok !== false) {
      if ($error === null) {
        addMessage('Inserido com sucesso');
      }
    }
  }
  return $ok;
}

// altera a senha do usuário
function usuarios_update($usuarios) {
  global $conexao;
  $ok = true;

  // se está tentando alterar a senha, faz algumas verificações
  if (!empty($usuarios['ds_senha'])) {
    if (strlen($usuarios['ds_senha']) < 5) {
      if ($error === null) {
        addMessage('Senha deve ter no mínimo 5 caracteres');
      } else {
        $error = 'Senha deve ter no mínimo 5 caracteres';
      }
      $ok = false;
    }
    if ($ok && $usuarios['ds_senha'] !== $usuarios['ds_senha2']) {
      if ($error === null) {
        addMessage('A primeira e a segunda senha estão diferentes');
      } else {
        $error = 'A primeira e a segunda senha estão diferentes';
      }
      $ok = false;
    }
  }
  if ($ok) {
    $sql = 'update erpc_usuarios set ';
    $campos = array('ds_email', 'ds_nome', 'id_grupo', 'st_bloqueado', 'ds_cep', 'ds_uf', 'ds_bairro', 'ds_endereco', 'ds_cpf', 'ds_rg');
    $values = array();
    foreach($campos as $campo) {
      $sql .= $campo . '=?,';
      $values[] = $usuarios[$campo];
    }
    // verifica se mandou nova imagem de perfil válida
    $ds_foto = usuarios_handle_uploads();
    if ($ds_foto !== false) {
      $sql .= 'ds_foto=?,';
      $values[] = $ds_foto;
    }
    // se mudou a senha, adiciona ela no update também
    if (!empty($usuarios['ds_senha'])) {
      $sql .= 'ds_senha=?,';
      $values[] = password_hash($usuarios['ds_senha'], PASSWORD_DEFAULT);
    }
    $sql = trim($sql, ',');
    $sql .= ' where id = ?';
    $values[] = $usuarios['id'];
    $ok = _prepareAndExecute($sql, $values);
    if ($ok !== false) {
      addMessage('Atualizado com sucesso');
    }
  }
  return $ok;
}

function usuarios_delete($usuarios) {
  global $conexao;
  $ok = false;
  $sql = 'update erpc_usuarios set st_ativo = 0';
  $values = array();
  $sql .= ' where id = ?';
  $values[] = $usuarios['id'];
  $ok = _prepareAndExecute($sql, $values);
  if ($ok !== false) {
    addMessage('Removido com sucesso');
  }
  return $ok;
}

// checa o login, se estiver logado continua, senão redireciona caso passou um endereço para redirect, ou retorna true se está logado false senão
function checkLogin($redirect = null) {
  $user = getLoggedUser();
  if ($user == null) {
    if ($redirect != null) {
      header("Location:$redirect");
      exit;
    }
  }
  return $user != null;
}

// pega o usuário logado da sessão
function getLoggedUser() {
  $u = null;
  if (isset($_SESSION[SESSION_USER_NAME])) {
    $u = $_SESSION[SESSION_USER_NAME];
  }
  return $u;
}

// Verifica se o usuário e senha estão corretos e caso tudo certo coloca um array do usuário na sessão.
function login($usuario) {
  global $conexao;
  $ok;
  $sql = "select * from erpc_usuarios where ds_email=?";
  $values[] = $usuario['email'];
  $result = _prepareAndQuery($sql, $values);
  if ($result !== false) {
    if (count($result) != 1) {
      addError('Usuário ou senha inválido');
      $ok = false;
    } else {
      $u = $result[0];
      if(password_verify($usuario['password'], $u['ds_senha'])) {
        if ((int)$u['st_ativo'] === 1) {
          addMessage('Login efetuado', 'success');
          $loggedUser = array();
          $loggedUser['id'] = $u['id'];
          $loggedUser['email'] = $u['ds_email'];
          $loggedUser['nome'] = $u['ds_nome'];
          $loggedUser['grupo'] = $u['id_grupo'];
          $loggedUser['imagem'] = $u['ds_foto'];
          $loggedUser['unidade']= '1';
          $_SESSION[SESSION_USER_NAME] = $loggedUser;
          $ok = true;
        } else {
          addError('Usuário inativo. Aguarde a ativação pelo administrador do site.');
          $ok = false;
        }
      } else {
        // senha errada?
        addError('Usuário ou senha inválido*');
        $ok = false;
      }
    }
  }

  return $ok;
}

// 2ª parte do login
function login2($usuario, &$redirect) {

  $redirect = 'desktop.php?modulo=desktop';
  $ok = true;
  return $ok;
}

// altera a senha do usuário
function novaSenha($usuario) {
  global $conexao;
  $ok = true;
  $hash = $_POST['h'];

  // antes de tudo, vamos ver se a senha está igual a outra e do tamanho mínimo
  if (strlen($usuario['password']) < 5) {
    addError('Senha deve ter no mínimo 5 caracteres');
    $ok = false;
  }

  if ($usuario['password'] !== $usuario['password2']) {
    addError('A primeira e a segunda senha estão diferentes');
    $ok = false;
  }

  if ($ok) {
    $sql = "update erpc_usuarios set ds_senha=?, ds_hash_reset=NULL, dt_expiry=NULL where ds_hash_reset=?";
    $values = array(password_hash($usuario['password'], PASSWORD_DEFAULT), $hash);
    $ok = _prepareAndExecute($sql, $values);
    if ($ok !== false) {
      $linhas = $ok;
      if ($linhas === 1) {
        addMessage('Senha alterada com sucesso');
      }
    } else {
      addError('Ocorreu um erro ao executar a atualização da senha, entre em contato com o administrador');
    }
  }
  return $ok;
}

function verificaValidadeHash() {
  global $conexao;
  $ok;
  $sql = "select dt_expiry from erpc_usuarios where ds_hash_reset=?";
  $hash = $_GET['h'];
  $agora = time();
  $values[] = $hash;

  $result = _prepareAndQuery($sql, $values);
  if ($result !== false) {
    if (count($result) === 1) {
      // verifica se não expirou ainda
      if ($agora <= (int)$result[0]['dt_expiry']) {
        $ok = true;
      } else {
        $ok = false;
        addError('Link expirou, por favor clique novamente em "esqueci minha senha" para gerar um novo link válido');
      }
    }
    else {
      $ok = false;
      addError('Link inválido');
    }
  }
  return $ok;
}

function esqueciSenha($usuario) {
  global $conexao;
  $ok;

  $sql = "update erpc_usuarios set ds_hash_reset=?, dt_expiry=? where ds_email=?";
  // usuário terá 1 hora para trocar de senha
  $email = $usuario['email'];
  $expiry = time() + 3600;
  $ds_hash_reset = hash('sha512', '{4Y~5>>Y8mp5M4Gh' . $expiry . $email, false);
  $values = array($ds_hash_reset, $expiry, $email);
  $ok = _prepareAndExecute($sql, $values);
  if ($ok !== false) {
    $linhas = mysqli_stmt_affected_rows($stmt);
    if ($linhas === 1) {
      // ok, acertamos a base, vamos agora gerar e enviar o e-mail
      $actual_link = dirname(strtok('http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'],'?')) . '/login-esqueci.php?h=' . $ds_hash_reset;
      $msg = 'Code Tecnologia

Este é um e-mail automático enviado para a recuperação de sua senha em nosso
sistema. Se você não solicitou isso, basta ignorar este e-mail.

Para alterar sua senha, siga o link abaixo:

' . $actual_link;
      $assunto = 'Alteração de senha - Code Tecnologia';
      $from = 'noreply@codecrm.com.br';
      $headers = 'Content-Type: text/plain; charset=UTF-8' . "\r\n";
      $headers .= 'Content-Transfer-Encoding: 8bit' . "\r\n";
      $headers .= 'From:' . $from . "\r\n"; // Set from headers
      mail($email, $assunto, $msg, $headers); // Send our email
      addMessage('Verifique sua caixa de mensagens pelo link para reiniciar sua senha');
    } else {
      addError('E-mail não cadastrado');
      $ok = false;
    }
  } else {
    AddError('Ocorreu um erro de BD ao tentar encontrar seu e-mail, entre em contato com o administrador');
    $ok = false;
  }
  mysqli_stmt_close($stmt);

  return $ok;
}

function registrar($usuario) {
  global $conexao;
  $camposToForm = array(
    'ds_email' => 'email',
    'ds_nome' => 'nome',
    'ds_senha' => 'password',
    'st_ativo' => 'st_ativo',
  );
  $campos = array_keys($camposToForm);
  $values = array();

  // antes de tudo, vamos ver se já não existe na tabela algum e-mail ou usuário já cadastrado, e verifica se a senha está igual a outra
  if (strlen($usuario['password']) < 5) {
    addError('Senha deve ter no mínimo 5 caracteres');
    return false;
  }

  if ($usuario['password'] !== $usuario['password2']) {
    addError('A primeira e a segunda senha estão diferentes');
    return false;
  }

  $sql = "select 'E-mail já cadastrado' as erro from erpc_usuarios where ds_email=?";
  $values[] = $usuario['email'];
  $result = _prepareAndQuery($sql, $values);
  if ($result !== false) {
    if (count($result) !== 0) {
      $erros = array();
      foreach($result as $erro) {
        $erros[] = $erro['erro'];
      }
      addError(implode('<br/>', $erros));
      return false;
    }
  }

  // chegou aqui ok, vamos registrar
  $values = array();
  $sql = 'insert into erpc_usuarios (' . implode(',', $campos) . ') values (';
  foreach($campos as $campo) {
    $sql .= '?, ';
    if ($campo === 'ds_senha') {
      $values[] = password_hash($usuario[$camposToForm[$campo]], PASSWORD_DEFAULT);
    } else {
      $values[] = $usuario[$camposToForm[$campo]];
    }
  }
  $sql = trim($sql, ' ,');
  $sql .= ')';
  $ok = _prepareAndExecute($sql, $values);
  if ($ok) {
    setaMsg('Usuário registrado com sucesso, aguarde o administrador liberar seu acesso', 'success');
  }
  return $ok;
}

// retorna false se não mandou arquivo ou é inválido, ou o nome do arquivo enviado
function usuarios_handle_uploads() {
  $retorno = false;

  $user = getLoggedUser();
  if ($user !== null) {
    $prefix = '';
    $dir = 'uploads/usuarios/';
    $incluirFoto = !empty($_FILES['imgFile']['name']);
    $erroFoto = false;
    $userId = (int)$user['id'];

    if ($incluirFoto) {
      $ext = pathinfo($_FILES['imgFile']['name'], PATHINFO_EXTENSION);
      $fileName = $userId . '-' . date('YmdHis') . '.' . $ext;
      $caminhoCompleto = $prefix . $dir . $fileName;
      $arquivo = $dir . $fileName;
      $allowed =  array('gif','png' ,'jpg', 'webp', 'jpeg');
      if (in_array($ext, $allowed)) {
        move_uploaded_file($_FILES['imgFile']['tmp_name'], $caminhoCompleto);
        $retorno = $arquivo;
      } else {
        $incluirFoto = false;
        $erroFoto = true;
        addError('Arquivo com extensão inválida, ignorando e seguindo em frente.');
      }
    }
  }

  return $retorno;
}

function usuarios_create() {
  date_default_timezone_set('America/Sao_Paulo');
  $usuario = array(
    'id' => '',
    'ds_email' => '',
    'ds_senha' => '',
    'ds_hash_reset' => '',
    'ds_nome' => '',
    'id_grupo' => '0',
    'ds_foto' => '',
    'st_ativo' => '1',
    'ds_senha2' => '',
    'st_bloqueado' => '0',
    'ds_cep' => '',
    'ds_uf' => '',
    'ds_bairro' => '',
    'ds_endereco' => '',
    'ds_cpf' => '',
    'ds_rg' => '',
    'ds_crp'=> ''
  );
  return $usuario;
}
