package com.example.pap_teste;

import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Spinner;
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 com.example.pap_teste.models.Mesa;
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 com.google.firebase.auth.FirebaseAuth;

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

import androidx.annotation.NonNull;

public class GerirMesasActivity extends AppCompatActivity {

    private final List<Mesa> mesas = new ArrayList<>();
    private ArrayAdapter<String> adapter;
    private ListView listMesas;
    private EditText inputNumero;
    private EditText inputCapacidade;
    private Spinner spinnerEstado;
    private TextView txtMensagem;
    private DatabaseReference mDatabase;
    private Mesa selectedMesa = null;

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

        bindViews();

        mDatabase = FirebaseDatabase.getInstance().getReference("Mesas");

        setupList();
        setupFormActions();
    }

    private void bindViews() {
        listMesas = findViewById(R.id.listMesas);
        inputNumero = findViewById(R.id.inputMesaNumero);
        inputCapacidade = findViewById(R.id.inputMesaCapacidade);
        spinnerEstado = findViewById(R.id.spinnerEstadoMesa);
        txtMensagem = findViewById(R.id.txtMensagemMesa);

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

        ArrayAdapter<String> estadoAdapter = new ArrayAdapter<>(
                this,
                android.R.layout.simple_spinner_dropdown_item,
                new String[] { "Livre", "Ocupada", "Reservada" });
        spinnerEstado.setAdapter(estadoAdapter);
    }

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

        mDatabase.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                mesas.clear();
                adapter.clear();
                String currentUserEmail = FirebaseAuth.getInstance().getCurrentUser() != null 
                        ? FirebaseAuth.getInstance().getCurrentUser().getEmail() 
                        : "";
                for (DataSnapshot postSnapshot : snapshot.getChildren()) {
                    Mesa mesa = postSnapshot.getValue(Mesa.class);
                    if (mesa != null && (mesa.getRestauranteEmail() == null || mesa.getRestauranteEmail().equals(currentUserEmail))) {
                        // Ensure the ID is set from the snapshot key if it's missing in the value
                        mesa.setId(postSnapshot.getKey());
                        mesas.add(mesa);
                        String resumo = String.format("Mesa %02d • %d lugares • %s", mesa.getNumero(),
                                mesa.getCapacidade(), mesa.getEstado());
                        adapter.add(resumo);
                    }
                }
                adapter.notifyDataSetChanged();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
                Toast.makeText(GerirMesasActivity.this, "Erro ao carregar mesas: " + error.getMessage(),
                        Toast.LENGTH_SHORT).show();
            }
        });

        listMesas.setOnItemClickListener((parent, view, position, id) -> {
            Mesa item = mesas.get(position);
            selectedMesa = item;
            inputNumero.setText(String.valueOf(item.getNumero()));
            inputCapacidade.setText(String.valueOf(item.getCapacidade()));
            spinnerEstado.setSelection(getEstadoIndex(item.getEstado()));
            txtMensagem.setText(String.format("Editar mesa %d", item.getNumero()));
        });
    }

    private int getEstadoIndex(String estado) {
        if ("Ocupada".equalsIgnoreCase(estado)) {
            return 1;
        }
        if ("Reservada".equalsIgnoreCase(estado)) {
            return 2;
        }
        return 0;
    }

    private void setupFormActions() {
        Button btnGuardar = findViewById(R.id.btnGuardarMesa);
        if (btnGuardar != null) {
            btnGuardar.setOnClickListener(v -> guardarMesa());
        }

        Button btnRemover = findViewById(R.id.btnRemoverMesa);
        if (btnRemover != null) {
            btnRemover.setOnClickListener(v -> removerMesa());
        }
    }

    private void removerMesa() {
        if (selectedMesa == null || selectedMesa.getId() == null) {
            Toast.makeText(this, "Selecione uma mesa válida para remover.", Toast.LENGTH_SHORT).show();
            return;
        }

        mDatabase.child(selectedMesa.getId()).removeValue()
                .addOnSuccessListener(aVoid -> {
                    Toast.makeText(this, "Mesa removida com sucesso.", Toast.LENGTH_SHORT).show();
                    limparCampos();
                })
                .addOnFailureListener(e -> {
                    Toast.makeText(this, "Erro ao remover mesa: " + e.getMessage(), Toast.LENGTH_SHORT).show();
                });
    }

    private void limparCampos() {
        inputNumero.setText("");
        inputCapacidade.setText("");
        selectedMesa = null;
        txtMensagem.setText("");
    }

    private void guardarMesa() {
        String numeroStr = inputNumero.getText().toString().trim();
        String capacidadeStr = inputCapacidade.getText().toString().trim();
        String estado = (String) spinnerEstado.getSelectedItem();

        if (numeroStr.isEmpty() || capacidadeStr.isEmpty() || estado == null) {
            Toast.makeText(this, "Preencha número, capacidade e estado.", Toast.LENGTH_SHORT).show();
            return;
        }

        int numero;
        int capacidade;
        try {
            numero = Integer.parseInt(numeroStr);
            capacidade = Integer.parseInt(capacidadeStr);
        } catch (NumberFormatException e) {
            Toast.makeText(this, "Use apenas números válidos.", Toast.LENGTH_SHORT).show();
            return;
        }

        Mesa existente = findMesa(numero);
        String mesaId;
        String currentUserEmail = FirebaseAuth.getInstance().getCurrentUser() != null 
                ? FirebaseAuth.getInstance().getCurrentUser().getEmail() 
                : "";

        if (existente == null) {
            mesaId = mDatabase.push().getKey();
            Mesa novaMesa = new Mesa(mesaId, numero, capacidade, estado, currentUserEmail);
            if (mesaId != null) {
                mDatabase.child(mesaId).setValue(novaMesa);
            }
            txtMensagem.setText(String.format("Mesa %d adicionada.", numero));
        } else {
            mesaId = existente.getId();
            if (mesaId == null) {
                Toast.makeText(this, "Erro ao atualizar: ID não encontrado.", Toast.LENGTH_SHORT).show();
                return;
            }
            existente.setCapacidade(capacidade);
            existente.setEstado(estado);
            mDatabase.child(mesaId).setValue(existente);
            txtMensagem.setText(String.format("Mesa %d atualizada.", numero));
        }

        // Clearing inputs
        limparCampos();
    }

    private Mesa findMesa(int numero) {
        for (Mesa item : mesas) {
            if (item.getNumero() == numero) {
                return item;
            }
        }
        return null;
    }

}
