import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

/* ========= ENUMS ========= */

enum StatusOS {
    ABERTA,
    EM_EXECUCAO,
    FINALIZADA
}

enum TipoOS {
    CORRETIVA,
    PREVENTIVA
}

enum PrioridadeOS {
    BAIXA,
    MEDIA,
    ALTA
}

/* ========= MODEL ========= */

class Responsavel {
    Long id;
    String nome;
    String area;

    Responsavel(Long id, String nome, String area) {
        this.id = id;
        this.nome = nome;
        this.area = area;
    }
}

class OrdemServico {
    Long id;
    String titulo;
    String descricao;
    TipoOS tipo;
    PrioridadeOS prioridade;
    StatusOS status;
    LocalDateTime dataAbertura;
    LocalDateTime dataFechamento;
    Responsavel responsavel;

    OrdemServico(Long id, String titulo, String descricao,
                 TipoOS tipo, PrioridadeOS prioridade) {

        this.id = id;
        this.titulo = titulo;
        this.descricao = descricao;
        this.tipo = tipo;
        this.prioridade = prioridade;
        this.status = StatusOS.ABERTA;
        this.dataAbertura = LocalDateTime.now();
    }
}

class HistoricoOS {
    StatusOS statusAnterior;
    StatusOS statusNovo;
    LocalDateTime data;
    String observacao;

    HistoricoOS(StatusOS anterior, StatusOS novo, String obs) {
        this.statusAnterior = anterior;
        this.statusNovo = novo;
        this.observacao = obs;
        this.data = LocalDateTime.now();
    }
}

/* ========= REPOSITORY (simulado) ========= */

class OrdemServicoRepository {
    List<OrdemServico> ordens = new ArrayList<>();

    void save(OrdemServico os) {
        ordens.add(os);
    }

    OrdemServico findById(Long id) {
        return ordens.stream()
                .filter(o -> o.id.equals(id))
                .findFirst()
                .orElse(null);
    }

    List<OrdemServico> findAll() {
        return ordens;
    }
}

/* ========= SERVICE ========= */

class OrdemServicoService {

    OrdemServicoRepository repository;
    List<HistoricoOS> historico = new ArrayList<>();

    OrdemServicoService(OrdemServicoRepository repository) {
        this.repository = repository;
    }

    void criarOS(Long id, String titulo, String descricao,
                 TipoOS tipo, PrioridadeOS prioridade) {

        OrdemServico os = new OrdemServico(id, titulo, descricao, tipo, prioridade);
        repository.save(os);

        historico.add(new HistoricoOS(null, StatusOS.ABERTA, "OS criada"));
        System.out.println("✔ OS criada: " + titulo);
    }

    void atribuirResponsavel(Long osId, Responsavel r) {
        OrdemServico os = repository.findById(osId);
        os.responsavel = r;

        System.out.println("👤 Responsável atribuído: " + r.nome);
    }

    void iniciarOS(Long osId) {
        OrdemServico os = repository.findById(osId);

        if (os.status != StatusOS.ABERTA) {
            System.out.println("❌ OS não pode ser iniciada");
            return;
        }

        historico.add(new HistoricoOS(os.status, StatusOS.EM_EXECUCAO, "OS iniciada"));
        os.status = StatusOS.EM_EXECUCAO;
    }

    void finalizarOS(Long osId) {
        OrdemServico os = repository.findById(osId);

        if (os.status != StatusOS.EM_EXECUCAO) {
            System.out.println("❌ OS não pode ser finalizada");
            return;
        }

        historico.add(new HistoricoOS(os.status, StatusOS.FINALIZADA, "OS finalizada"));
        os.status = StatusOS.FINALIZADA;
        os.dataFechamento = LocalDateTime.now();
    }

    void listarOS() {
        repository.findAll().forEach(os ->
                System.out.println(
                        os.id + " | " + os.titulo +
                        " | " + os.status +
                        " | Prioridade: " + os.prioridade
                )
        );
    }

    void exibirHistorico() {
        historico.forEach(h ->
                System.out.println(
                        h.statusAnterior + " → " + h.statusNovo +
                        " | " + h.observacao +
                        " | " + h.data
                )
        );
    }
}

/* ========= CONTROLLER (simulado) ========= */

public class Main {

    public static void main(String[] args) {

        OrdemServicoRepository repository = new OrdemServicoRepository();
        OrdemServicoService service = new OrdemServicoService(repository);

        Responsavel tecnico = new Responsavel(1L, "Carlos", "Manutenção");

        // Simulando endpoints REST
        service.criarOS(1L, "Troca de lâmpada", "Lâmpada queimada no corredor",
                TipoOS.CORRETIVA, PrioridadeOS.BAIXA);

        service.atribuirResponsavel(1L, tecnico);
        service.iniciarOS(1L);
        service.finalizarOS(1L);

        System.out.println("\n📋 ORDENS DE SERVIÇO:");
        service.listarOS();

        System.out.println("\n🕓 HISTÓRICO:");
        service.exibirHistorico();
    }
}

Embed on website

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