package com.example.pap_teste;

import android.os.Bundle;

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 android.widget.Button;

import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.example.pap_teste.models.Reserva;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

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

public class ListaEsperaActivity extends AppCompatActivity {

    private final List<Reserva> reservasPendentes = new ArrayList<>();
    private ArrayAdapter<String> adapter;
    private ListView listReservas;
    private TextView txtInfo, txtNotas, txtMensagem;
    private Button btnConfirmar, btnRecusar;
    private int selectedIndex = -1;
    private String restaurantEmail;
    private DatabaseReference databaseReference;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_lista_espera);
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.listaEsperaRoot), (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 = ""; // Avoid hardcoded sabor_arte so we don't accidentally load wrong data
            }
        }

        bindViews();
        setupList();
        setupActions();
        loadReservasPendentes();
    }

    private void bindViews() {
        listReservas = findViewById(R.id.listReservasP);
        txtInfo = findViewById(R.id.txtReservaInfoP);
        txtNotas = findViewById(R.id.txtReservaNotasP);
        txtMensagem = findViewById(R.id.txtMensagemReservaP);
        btnConfirmar = findViewById(R.id.btnConfirmarReservaP);
        btnRecusar = findViewById(R.id.btnRecusarReservaP);

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

    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(reservasPendentes.get(position));
        });
    }

    private void setupActions() {
        btnConfirmar.setOnClickListener(v -> mostrarMesasDisponiveis());
        btnRecusar.setOnClickListener(v -> showRecusarDialog());
    }

    private void mostrarMesasDisponiveis() {
        if (selectedIndex < 0 || selectedIndex >= reservasPendentes.size()) {
            Toast.makeText(this, "Selecione uma reserva.", Toast.LENGTH_SHORT).show();
            return;
        }
        Reserva item = reservasPendentes.get(selectedIndex);
        
        DatabaseReference mesasRef = FirebaseDatabase.getInstance().getReference("Mesas");
        mesasRef.orderByChild("restauranteEmail").equalTo(restaurantEmail).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@androidx.annotation.NonNull DataSnapshot snapshot) {
                List<com.example.pap_teste.models.Mesa> mesasLivres = new ArrayList<>();
                for (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(ListaEsperaActivity.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 lugar reservado)?")
                        .setPositiveButton("Sim", (dialog, which) -> atualizarEstadoSelecionado("Confirmada"))
                        .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(ListaEsperaActivity.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 DatabaseError error) {
                Toast.makeText(ListaEsperaActivity.this, "Erro ao carregar mesas.", Toast.LENGTH_SHORT).show();
            }
        });
    }

    private void confirmarReservaComMesa(Reserva reserva, com.example.pap_teste.models.Mesa mesa) {
        String novoEstado = "Confirmada (Mesa " + mesa.getNumero() + ")";
        databaseReference.child(reserva.getId()).child("estado").setValue(novoEstado).addOnCompleteListener(task -> {
            if (task.isSuccessful()) {
                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();
                        selectedIndex = -1;
                        toggleButtons(null);
                    });
            } else {
                Toast.makeText(this, "Erro ao confirmar reserva.", Toast.LENGTH_SHORT).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 atualizarEstadoSelecionado(String novoEstado) {
        if (selectedIndex < 0 || selectedIndex >= reservasPendentes.size()) {
            Toast.makeText(this, "Selecione uma reserva para avaliar.", Toast.LENGTH_SHORT).show();
            return;
        }

        Reserva item = reservasPendentes.get(selectedIndex);
        databaseReference.child(item.getId()).child("estado").setValue(novoEstado).addOnCompleteListener(task -> {
            if (task.isSuccessful()) {
                Toast.makeText(this, "Reserva avaliada com sucesso.", Toast.LENGTH_SHORT).show();
                selectedIndex = -1;
                toggleButtons(null);
            } else {
                Toast.makeText(this, "Erro ao alterar estado da reserva.", Toast.LENGTH_SHORT).show();
            }
        });
    }

    private void mostrarDetalhe(Reserva item) {
        txtInfo.setText(String.format("%s • %s", item.getClienteEmail(), item.getHora()));
        txtNotas.setText(String.format("Data: %s • Pessoas: %d", item.getData(), item.getPessoas()));
        toggleButtons(item);
    }

    private void toggleButtons(Reserva item) {
        if (item == null) {
            btnConfirmar.setVisibility(android.view.View.GONE);
            btnRecusar.setVisibility(android.view.View.GONE);
            txtInfo.setText("Selecione uma reserva");
            txtNotas.setText("");
            return;
        }
        btnConfirmar.setVisibility(android.view.View.VISIBLE);
        btnRecusar.setVisibility(android.view.View.VISIBLE);
    }

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

                    @Override
                    public void onCancelled(@androidx.annotation.NonNull DatabaseError error) {
                        Toast.makeText(ListaEsperaActivity.this, "Erro ao carregar lista de espera.", Toast.LENGTH_SHORT).show();
                    }
                });
    }

    private void refreshList() {
        adapter.clear();
        for (Reserva item : reservasPendentes) {
            adapter.add(String.format("%s - %dp • %s", item.getHora(), item.getPessoas(), item.getClienteEmail()));
        }
        adapter.notifyDataSetChanged();
    }
}





