// Criar estrutura inicial

// Dentro da pasta desafio-backend-uber-java:

src/
 ├── Main.java
 ├── model/
 │    └── Corrida.java
 ├── service/
 │    ├── CorridaService.java
 │    ├── CsvService.java
 │    └── PdfService.java

// Entender o problema (antes de codar)

// Quais dados o sistema trabalha? Quais ações o sistema faz? Quais regras precisam ser respeitadas?
// model → dados | service → regras | repository → armazenamento (em memória)

// Criar as ENTIDADES (model) | model/Motorista.java
package com.joaodddev.model;

public class Motorista {

    private String nome;
    private boolean disponivel;

    public Motorista(String nome) {
        this.nome = nome;
        this.disponivel = true;
    }

    public String getNome() {
        return nome;
    }

    public boolean isDisponivel() {
        return disponivel;
    }

    public void setDisponivel(boolean disponivel) {
        this.disponivel = disponivel;
    }
}

// Conceitos aplicados: Encapsulamento | Estado (disponivel) | Getters / setters

// model/StatusCorrida.java
package com.joaodddev.model;

public enum StatusCorrida {
    SOLICITADA,
    EM_ANDAMENTO,
    FINALIZADA
}

// Enum = status controlado (boa prática real)

// model/Corrida.java
package com.joaodddev.model;

public class Corrida {

    private Motorista motorista;
    private double distanciaKm;
    private double valor;
    private StatusCorrida status;

    public Corrida(Motorista motorista, double distanciaKm) {
        this.motorista = motorista;
        this.distanciaKm = distanciaKm;
        this.valor = distanciaKm * 5.0; // regra simples
        this.status = StatusCorrida.SOLICITADA;
    }

    public Motorista getMotorista() {
        return motorista;
    }

    public double getValor() {
        return valor;
    }

    public StatusCorrida getStatus() {
        return status;
    }

    public void iniciar() {
        status = StatusCorrida.EM_ANDAMENTO;
        motorista.setDisponivel(false);
    }

    public void finalizar() {
        status = StatusCorrida.FINALIZADA;
        motorista.setDisponivel(true);
    }
}

// Regra de negócio dentro da entidade

// Criar o “banco” em memória (repository) | repository/CorridaRepository.java
package com.joaodddev.repository;

import com.joaodddev.model.Corrida;
import java.util.ArrayList;
import java.util.List;

public class CorridaRepository {

    private final List<Corrida> corridas = new ArrayList<>();

    public void salvar(Corrida corrida) {
        corridas.add(corrida);
    }

    public List<Corrida> listar() {
        return corridas;
    }
}

// Criar a regra de negócio (service) | service/CorridaService.java
package com.joaodddev.service;

import com.joaodddev.model.Corrida;
import com.joaodddev.model.Motorista;
import com.joaodddev.repository.CorridaRepository;

import java.io.FileWriter;
import java.io.IOException;
import java.util.List;

public class CorridaService {

    private final CorridaRepository repository = new CorridaRepository();
    private Corrida corridaAtual;

    public void solicitarCorrida(Motorista motorista, double distancia) {

        if (!motorista.isDisponivel()) {
            System.out.println("Motorista indisponível.");
            return;
        }

        corridaAtual = new Corrida(motorista, distancia);
        corridaAtual.iniciar();
        repository.salvar(corridaAtual);

        System.out.println("Corrida iniciada com sucesso!");
    }

    public void finalizarCorrida() {

        if (corridaAtual == null) {
            System.out.println("Nenhuma corrida em andamento.");
            return;
        }

        corridaAtual.finalizar();
        corridaAtual = null;

        System.out.println("Corrida finalizada!");
    }

    public List<Corrida> listarHistorico() {
        return repository.listar();
    }

    public boolean temCorridaEmAndamento() {
        return corridaAtual != null;
    }

    // 🔥 EXPORTAÇÃO CSV
    public void exportarCSV() {

        List<Corrida> corridas = repository.listar();

        if (corridas.isEmpty()) {
            System.out.println("Nenhuma corrida para exportar.");
            return;
        }

        try (FileWriter writer = new FileWriter("historico_corridas.csv")) {

            writer.write("Motorista,Valor,Status\n");

            for (Corrida c : corridas) {
                writer.write(
                        c.getMotorista().getNome() + "," +
                        c.getValor() + "," +
                        c.getStatus() + "\n"
                );
            }

            System.out.println("CSV gerado com sucesso: historico_corridas.csv");

        } catch (IOException e) {
            System.out.println("Erro ao gerar CSV: " + e.getMessage());
        }
    }
}

// Motorista só aceita corrida se estiver disponível | Corrida muda status | Motorista muda estado

// Gerador de PDF | PdfService.java
package com.joaodddev.service;

import com.joaodddev.model.Corrida;
import com.lowagie.text.*;
import com.lowagie.text.pdf.PdfWriter;

import java.io.FileOutputStream;
import java.util.List;

public class PdfService {

    public void gerarRelatorio(List<Corrida> corridas) {

        if (corridas.isEmpty()) {
            System.out.println("Nenhuma corrida para gerar PDF.");
            return;
        }

        try {
            Document document = new Document();
            PdfWriter.getInstance(document, new FileOutputStream("relatorio_corridas.pdf"));

            document.open();

            Font titulo = new Font(Font.HELVETICA, 18, Font.BOLD);
            Font texto = new Font(Font.HELVETICA, 12);

            document.add(new Paragraph("Relatório de Corridas", titulo));
            document.add(new Paragraph(" "));

            for (Corrida c : corridas) {
                document.add(new Paragraph(
                        "Motorista: " + c.getMotorista().getNome()
                                + " | Valor: R$ " + c.getValor()
                                + " | Status: " + c.getStatus(),
                        texto
                ));
            }

            document.close();

            System.out.println("PDF gerado com sucesso: relatorio_corridas.pdf");

        } catch (Exception e) {
            System.out.println("Erro ao gerar PDF: " + e.getMessage());
        }
    }
}

// Criar o menu interativo | Main.java
package com.joaodddev;

import com.joaodddev.model.Corrida;
import com.joaodddev.model.Motorista;
import com.joaodddev.service.CorridaService;
import com.joaodddev.service.PdfService;

import java.util.List;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        // 🔹 Instancie os serviços AQUI (uma única vez)
        CorridaService corridaService = new CorridaService();
        CsvService csvService = new CsvService();
        PdfService pdfService = new PdfService();

        boolean executando = true;

        while (executando) {
            System.out.println("\n=== MENU ===");
            System.out.println("1 - Cadastrar motorista");
            System.out.println("2 - Solicitar corrida");
            System.out.println("3 - Finalizar corrida");
            System.out.println("4 - Ver histórico de corridas");
            System.out.println("5 - Exportar CSV");
            System.out.println("6 - Gerar PDF");
            System.out.println("0 - Sair");

            int opcao = scanner.nextInt();

            switch (opcao) {
                case 1:
                    corridaService.registrarCorrida(scanner);
                    break;

                case 2:
                    corridaService.listarCorridas();
                    break;

                case 3:
                    csvService.exportar(corridaService.getCorridas());
                    break;

                case 4:
                    pdfService.gerarRelatorio(corridaService.getCorridas());
                    break;

                case 0:
                    executando = false;
                    break;

                default:
                    System.out.println("Opção inválida!");
            }
        }

        scanner.close();
    }
}

// Adicionar no pom.xml
<dependencies>
    <dependency>
        <groupId>com.github.librepdf</groupId>
        <artifactId>openpdf</artifactId>
        <version>1.3.30</version>
    </dependency>
</dependencies>
    
Sistema completo com:

Menu interativo
Controle de estado
Histórico de dados
Regras de negócio
Arquitetura limpa

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: