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)
            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.orderByChild("restauranteEmail").equalTo(restaurantEmail)
                .addValueEventListener(new com.google.firebase.database.ValueEventListener() {
                    @Override
                    public void onDataChange(
                            @androidx.annotation.NonNull com.google.firebase.database.DataSnapshot snapshot) {
                        reservas.clear();
                        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())) {
                                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())) {
                    atualizarEstadoSelecionado("Confirmada");
                } else if ("Confirmada".equals(item.getEstado())) {
                    atualizarEstadoSelecionado("Concluída");
                }
            });
        }

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

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

    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) {
        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);
        databaseReference.child(item.getId()).child("estado").setValue(novoEstado).addOnCompleteListener(task -> {
            if (task.isSuccessful()) {
                txtMensagem
                        .setText(String.format("Reserva de %s marcada como %s.", item.getClienteEmail(), novoEstado));
                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());
        txtEstado.setText(String.format("Estado: %s", item.getEstado()));
        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 "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);
                break;
            case "Concluída":
                btnConfirmar.setVisibility(android.view.View.GONE);
                btnRecusar.setVisibility(android.view.View.GONE);
                btnApagar.setVisibility(android.view.View.VISIBLE);
                break;
            default: // 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();
    }
}
