package com.example.pap_teste;

import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

import java.util.ArrayList;
import java.util.List;

public class DetalhesReservasActivity extends AppCompatActivity {

    private final List<com.example.pap_teste.models.Reserva> reservas = new ArrayList<>();
    private ArrayAdapter<String> adapter;
    private ListView listReservas;
    private TextView txtInfo;
    private TextView txtNotas;
    private TextView txtEstado;
    private TextView txtMensagem;
    private Button btnConfirmar, btnRecusar, btnApagar;
    private int selectedIndex = -1;
    private String restaurantEmail;
    private com.google.firebase.database.DatabaseReference databaseReference;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_detalhes_reservas);
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.detalhesReservasRoot), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });

        restaurantEmail = getIntent().getStringExtra(MainActivity.EXTRA_EMAIL);
        if (restaurantEmail == null) {
            if (com.google.firebase.auth.FirebaseAuth.getInstance().getCurrentUser() != null) {
                restaurantEmail = com.google.firebase.auth.FirebaseAuth.getInstance().getCurrentUser().getEmail();
            } else {
                restaurantEmail = "sabor_arte@restaurante.com";
            }
        }

        bindViews();
        setupList();
        setupActions();
        loadReservas();
    }

    private void bindViews() {
        listReservas = findViewById(R.id.listReservas);
        txtInfo = findViewById(R.id.txtReservaInfo);
        txtNotas = findViewById(R.id.txtReservaNotas);
        txtEstado = findViewById(R.id.txtReservaEstado);
        txtMensagem = findViewById(R.id.txtMensagemReserva);

        btnConfirmar = findViewById(R.id.btnConfirmarReserva);
        btnRecusar = findViewById(R.id.btnCancelarReserva);
        btnApagar = findViewById(R.id.btnApagarReserva);

        Button back = findViewById(R.id.btnVoltar);
        if (back != null) {
            back.setOnClickListener(v -> finish());
        }
    }

    private void loadReservas() {
        databaseReference = com.google.firebase.database.FirebaseDatabase.getInstance().getReference("reservas");
        databaseReference.addValueEventListener(new com.google.firebase.database.ValueEventListener() {
                    @Override
                    public void onDataChange(
                            @androidx.annotation.NonNull com.google.firebase.database.DataSnapshot snapshot) {
                        reservas.clear();
                        String targetEmail = restaurantEmail != null ? restaurantEmail.trim() : "";
                        for (com.google.firebase.database.DataSnapshot data : snapshot.getChildren()) {
                            com.example.pap_teste.models.Reserva r = data
                                    .getValue(com.example.pap_teste.models.Reserva.class);
                            if (r != null && r.getEstado() != null && !"Arquivada".equals(r.getEstado())) {
                                String rEmail = r.getRestauranteEmail();
                                if (rEmail != null && rEmail.trim().equalsIgnoreCase(targetEmail)) {
                                    reservas.add(r);
                                }
                            }
                        }
                        refreshList();
                    }

                    @Override
                    public void onCancelled(
                            @androidx.annotation.NonNull com.google.firebase.database.DatabaseError error) {
                        Toast.makeText(DetalhesReservasActivity.this, "Erro ao carregar reservas.", Toast.LENGTH_SHORT)
                                .show();
                    }
                });
    }

    private void setupList() {
        adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_activated_1);
        listReservas.setAdapter(adapter);

        listReservas.setOnItemClickListener((parent, view, position, id) -> {
            selectedIndex = position;
            mostrarDetalhe(reservas.get(position));
        });
    }

    private void setupActions() {
        if (btnConfirmar != null) {
            btnConfirmar.setOnClickListener(v -> {
                com.example.pap_teste.models.Reserva item = reservas.get(selectedIndex);
                if ("Pendente".equals(item.getEstado())) {
                    mostrarMesasDisponiveis();
                } else if ("Confirmada".equals(item.getEstado()) || item.getEstado().startsWith("Confirmada (Mesa")) {
                    showConcluirDialog();
                }
            });
        }

        if (btnRecusar != null) {
            btnRecusar.setOnClickListener(v -> showRecusarDialog());
        }

        if (btnApagar != null) {
            btnApagar.setOnClickListener(v -> apagarReserva());
        }
    }

    private void mostrarMesasDisponiveis() {
        if (selectedIndex < 0 || selectedIndex >= reservas.size()) {
            Toast.makeText(this, "Selecione uma reserva.", Toast.LENGTH_SHORT).show();
            return;
        }
        com.example.pap_teste.models.Reserva item = reservas.get(selectedIndex);
        
        com.google.firebase.database.DatabaseReference mesasRef = com.google.firebase.database.FirebaseDatabase.getInstance().getReference("Mesas");
        mesasRef.orderByChild("restauranteEmail").equalTo(restaurantEmail).addListenerForSingleValueEvent(new com.google.firebase.database.ValueEventListener() {
            @Override
            public void onDataChange(@androidx.annotation.NonNull com.google.firebase.database.DataSnapshot snapshot) {
                List<com.example.pap_teste.models.Mesa> mesasLivres = new ArrayList<>();
                for (com.google.firebase.database.DataSnapshot ds : snapshot.getChildren()) {
                    com.example.pap_teste.models.Mesa m = ds.getValue(com.example.pap_teste.models.Mesa.class);
                    if (m != null && m.getEstado() != null && m.getEstado().equalsIgnoreCase("Livre") && m.getCapacidade() >= item.getPessoas()) {
                        m.setId(ds.getKey());
                        mesasLivres.add(m);
                    }
                }
                
                if (mesasLivres.isEmpty()) {
                    new androidx.appcompat.app.AlertDialog.Builder(DetalhesReservasActivity.this)
                        .setTitle("Sem mesas disponíveis")
                        .setMessage("Não há mesas livres com capacidade suficiente para " + item.getPessoas() + " pessoas. Deseja confirmar a reserva mesmo assim (sem mesa atribuída)?")
                        .setPositiveButton("Sim", (dialog, which) -> atualizarEstadoSelecionado("Confirmada", null))
                        .setNegativeButton("Não", null)
                        .show();
                    return;
                }
                
                String[] mesaOptions = new String[mesasLivres.size()];
                for (int i = 0; i < mesasLivres.size(); i++) {
                    com.example.pap_teste.models.Mesa m = mesasLivres.get(i);
                    mesaOptions[i] = String.format("Mesa %d (%d lugares)", m.getNumero(), m.getCapacidade());
                }
                
                new androidx.appcompat.app.AlertDialog.Builder(DetalhesReservasActivity.this)
                    .setTitle("Atribuir Mesa")
                    .setItems(mesaOptions, (dialog, which) -> {
                        com.example.pap_teste.models.Mesa selecionada = mesasLivres.get(which);
                        confirmarReservaComMesa(item, selecionada);
                    })
                    .setNegativeButton("Cancelar", null)
                    .show();
            }

            @Override
            public void onCancelled(@androidx.annotation.NonNull com.google.firebase.database.DatabaseError error) {
                Toast.makeText(DetalhesReservasActivity.this, "Erro ao carregar mesas.", Toast.LENGTH_SHORT).show();
            }
        });
    }

    private void confirmarReservaComMesa(com.example.pap_teste.models.Reserva reserva, com.example.pap_teste.models.Mesa mesa) {
        String novoEstado = "Confirmada (Mesa " + mesa.getNumero() + ")";
        
        java.util.Map<String, Object> updates = new java.util.HashMap<>();
        updates.put("estado", novoEstado);
        updates.put("motivo", null); // limpar possível motivo antigo

        databaseReference.child(reserva.getId()).updateChildren(updates).addOnCompleteListener(task -> {
            if (task.isSuccessful()) {
                com.google.firebase.database.FirebaseDatabase.getInstance().getReference("Mesas").child(mesa.getId()).child("estado").setValue("Reservada")
                    .addOnCompleteListener(t2 -> {
                        Toast.makeText(this, "Reserva aceite e mesa atribuída com sucesso.", Toast.LENGTH_SHORT).show();
                        reserva.setEstado(novoEstado);
                        reserva.setMotivo(null);
                        mostrarDetalhe(reserva);
                    });
            } else {
                Toast.makeText(this, "Erro ao confirmar reserva.", Toast.LENGTH_SHORT).show();
            }
        });
    }

    private void showConcluirDialog() {
        if (selectedIndex < 0) return;
        android.widget.EditText input = new android.widget.EditText(this);
        input.setHint("Notas de conclusão (opcional)");
        new androidx.appcompat.app.AlertDialog.Builder(this)
                .setTitle("Concluir Reserva")
                .setMessage("Deseja adicionar alguma nota ao concluir esta reserva?")
                .setView(input)
                .setPositiveButton("Concluir", (dialog, which) -> {
                    String motivo = input.getText().toString();
                    atualizarEstadoSelecionado("Concluída", motivo.isEmpty() ? null : motivo);
                })
                .setNegativeButton("Cancelar", null)
                .show();
    }

    private void showRecusarDialog() {
        if (selectedIndex < 0)
            return;

        String[] motivos = { "Sem espaço no restaurante", "Fora de horas", "Reserva duplicada", "Outro" };
        new androidx.appcompat.app.AlertDialog.Builder(this)
                .setTitle("Motivo da Recusa")
                .setItems(motivos, (dialog, which) -> {
                    atualizarEstadoSelecionado("Recusada", motivos[which]);
                })
                .setNegativeButton("Voltar", null)
                .show();
    }

    private void apagarReserva() {
        if (selectedIndex < 0)
            return;

        new androidx.appcompat.app.AlertDialog.Builder(this)
                .setTitle("Apagar/Arquivar Reserva")
                .setMessage("Tem a certeza que deseja limpar esta reserva da lista?")
                .setPositiveButton("Sim", (dialog, which) -> {
                    com.example.pap_teste.models.Reserva r = reservas.get(selectedIndex);
                    String idReserva = r.getId();

                    if ("Concluída".equals(r.getEstado()) || r.getEstado().startsWith("Confirmada")) {
                        databaseReference.child(idReserva).child("estado").setValue("Arquivada").addOnCompleteListener(task -> {
                            if (task.isSuccessful()) {
                                clearSelectionAndShowMessage();
                            }
                        });
                    } else {
                        databaseReference.child(idReserva).removeValue().addOnCompleteListener(task -> {
                            if (task.isSuccessful()) {
                                clearSelectionAndShowMessage();
                            }
                        });
                    }
                })
                .setNegativeButton("Voltar", null)
                .show();
    }

    private void clearSelectionAndShowMessage() {
        selectedIndex = -1;
        txtInfo.setText("Selecione uma reserva");
        txtNotas.setText("");
        txtEstado.setText("Estado:");
        txtMensagem.setText("Reserva processada e apagada da vista.");
        toggleButtons(null);
    }

    private void atualizarEstadoSelecionado(String novoEstado, String motivo) {
        if (selectedIndex < 0 || selectedIndex >= reservas.size()) {
            Toast.makeText(this, "Selecione uma reserva para atualizar.", Toast.LENGTH_SHORT).show();
            return;
        }

        com.example.pap_teste.models.Reserva item = reservas.get(selectedIndex);
        java.util.Map<String, Object> updates = new java.util.HashMap<>();
        updates.put("estado", novoEstado);
        if (motivo != null && !motivo.isEmpty()) {
            updates.put("motivo", motivo);
        } else {
            updates.put("motivo", null);
        }

        databaseReference.child(item.getId()).updateChildren(updates).addOnCompleteListener(task -> {
            if (task.isSuccessful()) {
                txtMensagem
                        .setText(String.format("Reserva de %s marcada como %s.", item.getClienteEmail(), novoEstado));
                item.setEstado(novoEstado);
                item.setMotivo(motivo);
                mostrarDetalhe(item);
            }
        });
    }

    private void mostrarDetalhe(com.example.pap_teste.models.Reserva item) {
        txtInfo.setText(String.format("%s • %s • %s • %dp", item.getClienteEmail(), item.getRestauranteName(),
                item.getHora(), item.getPessoas()));
        txtNotas.setText("Data: " + item.getData());
        
        String estadoTexto = item.getEstado();
        if (item.getMotivo() != null && !item.getMotivo().isEmpty()) {
            estadoTexto += " (" + item.getMotivo() + ")";
        }
        txtEstado.setText(String.format("Estado: %s", estadoTexto));
        
        toggleButtons(item);
    }

    private void toggleButtons(com.example.pap_teste.models.Reserva item) {
        if (item == null) {
            btnConfirmar.setVisibility(android.view.View.GONE);
            btnRecusar.setVisibility(android.view.View.GONE);
            btnApagar.setVisibility(android.view.View.GONE);
            return;
        }

        switch (item.getEstado()) {
            case "Pendente":
                btnConfirmar.setText("Confirmar");
                btnConfirmar.setVisibility(android.view.View.VISIBLE);
                btnRecusar.setVisibility(android.view.View.VISIBLE);
                btnApagar.setVisibility(android.view.View.GONE);
                break;
            case "Concluída":
                btnConfirmar.setVisibility(android.view.View.GONE);
                btnRecusar.setVisibility(android.view.View.GONE);
                btnApagar.setVisibility(android.view.View.VISIBLE);
                break;
            default:
                if (item.getEstado() != null && item.getEstado().startsWith("Confirmada")) {
                    btnConfirmar.setText("Concluir");
                    btnConfirmar.setVisibility(android.view.View.VISIBLE);
                    btnRecusar.setVisibility(android.view.View.VISIBLE); // Still allow refusal
                    btnApagar.setVisibility(android.view.View.GONE);
                } else {
                    // Recusada or Cancelada
                    btnConfirmar.setVisibility(android.view.View.GONE);
                    btnRecusar.setVisibility(android.view.View.GONE);
                    btnApagar.setVisibility(android.view.View.VISIBLE); // Allow deleting refused ones as well
                }
                break;
        }
    }

    private void refreshList() {
        adapter.clear();
        for (com.example.pap_teste.models.Reserva item : reservas) {
            String resumo = String.format("%s - %s (%s) • %s", item.getHora(), item.getData(), item.getEstado(),
                    item.getClienteEmail());
            adapter.add(resumo);
        }
        adapter.notifyDataSetChanged();
    }
}
