From d2b3975d1d7625ed826d8af5449d21e29bd3e39f Mon Sep 17 00:00:00 2001
From: Muriki <mgy20@inf.ufpr.br>
Date: Fri, 6 Dec 2024 22:12:47 -0300
Subject: [PATCH] Implementado interface com usuario

---
 main.cpp                     | 246 +++++++++++++++++++++--------------
 sources/ControladorObras.cpp |  13 +-
 2 files changed, 153 insertions(+), 106 deletions(-)

diff --git a/main.cpp b/main.cpp
index 966f5a1..4c593a0 100644
--- a/main.cpp
+++ b/main.cpp
@@ -1,36 +1,93 @@
+#include <cstdio>
 #include <cstdlib>
 #include <iostream>
+#include <limits>
 
 #include "./sources/Biblioteca.hpp"
-#include "./sources/Livro.cpp"
+#include "./sources/Periodico.hpp"
+#include "./sources/Livro.hpp"
 
 using namespace std;
 
 
 typedef enum {
   START,
-  LISTUSERS,
-  QUERYFEES,
-  PAYFEES,
+  ADDUSER,      // Cadastrar usuario
+  LISTUSERS,    // Listar usuarios
+  QUERYFEES,    // Listar multas de um usuario
+  PAYFEES,      // Pagar multas de um usuario
+  ADDWORK,      // Adicionar uma Obra
+  LISTWORKS,    // Listar Obras
+  QUERYWORK,    // Pesquisar Obra
+  BORROWWORK,   // Emprestar Obra
+  RETURNWORK,   // Devolver Obra
   FINISH
 } states;
 
-
-int show_options () {
+int show_options() {
   int option;
-  cout << endl;
-  cout << "> Entre com um comando:" << endl;
-  cout << "1 - Listar usuarios" << endl;
-  cout << "2 - Consultar Multas" << endl;
-  cout << "3 - Pagar Multa" << endl;
-  cout << "4 - Finalizar" << endl;
-  cout << "> ";
-  cin >> option;
+
+  while (true) {
+    cout << endl;
+    cout << "> Entre com um comando:" << endl;
+    cout << "1 - Cadastrar usuario           " << endl;
+    cout << "2 - Listar usuarios             " << endl;
+    cout << "3 - Listar multas de um usuario " << endl;
+    cout << "4 - Pagar multas de um usuario  " << endl;
+    cout << "5 - Adicionar uma Obra          " << endl;
+    cout << "6 - Listar Obras                " << endl;
+    cout << "7 - Pesquisar Obra              " << endl;
+    cout << "8 - Emprestar Obra              " << endl;
+    cout << "9 - Devolver Obra               " << endl;
+    cout << "10 - Finalizar programa         " << endl;
+    cout << "-> ";
+
+    cin >> option;
+
+    // Check if the input is valid
+    if (cin.fail()) {
+      cin.clear(); // Clear the error flag
+      cin.ignore(numeric_limits<streamsize>::max(), '\n'); // Ignore the invalid input
+      cout << "Entrada inválida! Por favor, insira um número entre 1 e 10." << endl;
+      continue; // Restart the loop
+    }
+
+    // Check if the option is within the valid range
+    if (option >= 1 && option <= 10) { break; } // Valid option, exit the loop
+    else {
+      cout << "Opção inválida! Por favor, insira um número entre 1 e 10." << endl;
+    }
+  }
 
   return option;
 }
 
 
+//int show_options () {
+//  int option;
+//  while (true) {
+//    cout << endl;
+//    cout << "> Entre com um comando:" << endl;
+//    cout << "1 - Cadastrar usuario           " << endl;
+//    cout << "2 - Listar usuarios             " << endl;
+//    cout << "3 - Listar multas de um usuario " << endl;
+//    cout << "4 - Pagar multas de um usuario  " << endl;
+//    cout << "5 - Adicionar uma Obra          " << endl;
+//    cout << "6 - Listar Obras                " << endl;
+//    cout << "7 - Pesquisar Obra              " << endl;
+//    cout << "8 - Emprestar Obra              " << endl;
+//    cout << "9 - Devolver Obra               " << endl;
+//    cout << "10 - Finalizar programa         " << endl;
+//    cout << "-> ";
+//    cin >> option;
+//    if (option >= 1 && option <= 10)
+//      break;
+//  }
+//
+//  return option;
+//}
+
+
 int main(){
   system("clear");
 
@@ -46,98 +103,87 @@ int main(){
   contUsuarios.adicionarUsuario("Marcus", "12345", "Casa", "9988", "marcus@gmail.com");
 
   // Cria Obras
-  cout << ": Criando Obras" << endl;
   ControladorObras contObras = bib.getContObras();
-  string titulo, autor, editora; int ano;
-  for (int i=0; i<2 ;i++) {
-    cin >> titulo; cin >> ano; cin >> autor; cin >> editora;
-    Livro liv(titulo, ano, autor, editora);
-    contObras.adicionarObra(liv);
-  }
+
+  // Cria Periodicos
+  cout << "> Criando Periodicos" << endl;
+  Periodico p("Revista de Ciência", 2023, 5, 3);
+  contObras.adicionarObra(p);
+
+  // Cria Livros
+  cout << "> Criando Livros" << endl;
+  Livro l("C++ Programming", 2022, "John Doe", "Tech Books");
+  contObras.adicionarObra(l);
 
   contObras.mostrarDetalhes();
 
-  //// Interation Loop
-  //int option = START;
-  //while (option != FINISH) {
-  //  option = show_options();
-  //  string userCPF; int valor;
-
-  //  switch (option) {
-  //    case LISTUSERS:
-  //      contUsuarios.mostrarDetalhes();
-  //      break;
-
-  //    case QUERYFEES:
-  //      cout << "Entre com o CPF do usuário: ";   cin >> userCPF;
-  //      valor = contUsuarios.recuperarMultas(userCPF);
-  //      if (valor > 0) {
-  //        cout << "\nUsuario: " << userCPF << endl;
-  //        cout << "Valor a pagar: " << valor << endl;
-  //      } else {
-  //        cout << "Aviso: Usuario não possui multas" << endl;
-  //      }
-  //      break;
-
-  //    case PAYFEES:
-  //      cout << "Entre com o CPF do usuário: ";   cin >> userCPF;
-  //      cout << "Entre com o valor a pagar: ";    cin >> valor;
-  //      contUsuarios.registrarMultaPaga(userCPF, valor);
-  //      break;
-
-  //    case FINISH:
-  //      cout << "> Finalizando programa!" << endl;
-  //      return 0;
-
-  //    default:
-  //      cout << "Comando não reconhecido!" << endl;
-  //      break;
-  //  }
+  //cout << ": Criando Obras" << endl;
+  //ControladorObras contObras = bib.getContObras();
+  //string titulo, autor, editora; int ano;
+  //for (int i=0; i<2 ;i++) {
+  //  cin >> titulo; cin >> ano; cin >> autor; cin >> editora;
+  //  Livro liv(titulo, ano, autor, editora);
+  //  contObras.adicionarObra(liv);
   //}
+  //contObras.mostrarDetalhes();
+
+  // Interation Loop
+  int option = START;
+  while (option != FINISH) {
+    option = show_options();
+    string userCPF; int valor;
+
+    switch (option) {
+      case ADDUSER:
+        break;
+
+      case LISTUSERS:
+        contUsuarios.mostrarDetalhes();
+        break;
+
+      case QUERYFEES:
+        cout << "Entre com o CPF do usuário: ";   cin >> userCPF;
+        valor = contUsuarios.recuperarMultas(userCPF);
+        if (valor > 0) {
+          cout << "\nUsuario: " << userCPF << endl;
+          cout << "Valor a pagar: " << valor << endl;
+        } else {
+          cout << "Aviso: Usuario não possui multas" << endl;
+        }
+        break;
+
+      case PAYFEES:
+        cout << "Entre com o CPF do usuário: ";   cin >> userCPF;
+        cout << "Entre com o valor a pagar: ";    cin >> valor;
+        contUsuarios.registrarMultaPaga(userCPF, valor);
+        break;
+
+      case ADDWORK:
+        break;
+
+      case LISTWORKS:
+        contObras.mostrarDetalhes();
+        break;
+
+      case QUERYWORK:
+        break;
+
+      case BORROWWORK:
+        break;
+
+      case RETURNWORK:
+        break;
+
+      case FINISH:
+        cout << "> Finalizando programa!" << endl;
+        return 0;
+
+      default:
+        cout << "Comando não reconhecido!" << endl;
+        break;
+    }
+  }
 
   return 0;
 }
 
-
-
-  //// Cria Obras
-  //cout << "> Instanciando Controlador de Obras" << endl;
-  //ControladorObras contObras;
-
-  //cout << "> Criando Obras" << endl;
-  //string titulo, tipo; int ano, qtDisp, total;
-  //for (int i=0; i<3 ;i++){
-  //  cout << "Entre com o titulo da obra: ";           cin >> titulo;
-  //  cout << "Entre com o ano da obra: ";              cin >> ano;
-  //  cout << "Entre com o tipo da obra: ";             cin >> tipo;
-  //  cout << "Entre com a quantidade Disponivel: ";    cin >> qtDisp;
-  //  cout << "Entre com a quantidade Total: ";         cin >> total;
-  //  
-  //  DescricaoObra descricao(titulo, ano);
-  //  contObras.adicionarObra(tipo, descricao);
-  //}
-
-  //cout << "==> Instanciando uma Descricao de Obra: " << endl;
-  //DescricaoObra desc("Mochileiro das galáxias", 1999);
-  //desc.mostrarDetalhes();
-  //cout << endl;
-
-  //cout << "==> Instanciando um Periodico: " << endl;
-  //Periodico p("Revista de Ciência", 2023, 5, 3);
-  //p.mostrarDetalhes();
-  //cout << endl;
-
-  //cout << "==> Instanciando um Livro: " << endl;
-  //Livro l("C++ Programming", 2022, "John Doe", "Tech Books");
-  //l.mostrarDetalhes();
-  //cout << endl;
-
-  //cout << "==> Instanciando uma Obra: " << endl;
-  //int disponiveis = 10, total = 14;
-  //Obra ob(desc, disponiveis, total);
-  //ob.mostrarDetalhes();
-  //cout << endl;
-
-  //cout << "==> Instanciando o Controlador de Obras: " << endl;
-  //ControladorObras obras;
-
diff --git a/sources/ControladorObras.cpp b/sources/ControladorObras.cpp
index 0cee302..23747c4 100644
--- a/sources/ControladorObras.cpp
+++ b/sources/ControladorObras.cpp
@@ -11,10 +11,11 @@ ControladorObras::ControladorObras() {}
 
 // Method to display all Obras details
 void ControladorObras::mostrarDetalhes() const {
-    for (const auto& obra : this->obras) {
-        obra.mostrarDetalhes();
-        cout << endl;
-    }
+  cout << endl << "> LISTANDO OBRAS DO SISTEMA:" << endl << endl;
+  for (const auto& obra : this->obras) {
+    obra.mostrarDetalhes();
+    cout << endl << "-----" << endl << endl;
+  }
 }
 
 // Methods
@@ -22,7 +23,7 @@ pair<int, int> ControladorObras::pesquisarObra(DescricaoObra& descricao){
   pair <int, int> p = make_pair(0, 0);
 
   auto it_obra = find_if(this->obras.begin(), this->obras.end(), [&descricao](Obra& d) {
-        return descricao.getTitulo() == d.getTitulo();
+      return descricao.getTitulo() == d.getTitulo();
       });
 
   if (it_obra == this->obras.end()) {
@@ -36,7 +37,7 @@ pair<int, int> ControladorObras::pesquisarObra(DescricaoObra& descricao){
 
 void ControladorObras::adicionarObra(DescricaoObra& descricao){
   auto it_obra = find_if(this->obras.begin(), this->obras.end(), [&descricao](Obra& d) {
-        return descricao.getTitulo() == d.getTitulo();
+      return descricao.getTitulo() == d.getTitulo();
       });
 
   if (it_obra == this->obras.end()) {
-- 
GitLab