package com.example.tcg;

import android.app.AlertDialog;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.GridView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import com.example.tcg.adapters.CartaAdapter;
import com.example.tcg.db.DbHelper;
import com.google.android.material.floatingactionbutton.FloatingActionButton;

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

public class ColecaoActivity extends AppCompatActivity {

    private GridView gridView;
    private CartaAdapter adapter;
    private ArrayList<Carta> listaCartas;
    private FloatingActionButton voltarBtn;
    private TextView textoOuro;
    private JogadorManager jogador;
    private Spinner filtroSpinner;
    private Button lojaBtn;
    private Button venderTodasBtn;

    private String raridadeSelecionada = "Todas";


    private final String[] raridades = {"Todas", "Comum", "Incomum", "Rara", "Épica", "Lendária", "Especial"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        getWindow().getDecorView().setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                        | View.SYSTEM_UI_FLAG_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
        );

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_colecao);

        gridView = findViewById(R.id.gridCartas);
        voltarBtn = findViewById(R.id.voltarBtn);
        textoOuro = findViewById(R.id.textoOuro);
        filtroSpinner = findViewById(R.id.spinnerFiltro);
        lojaBtn = findViewById(R.id.botaoLoja);
        venderTodasBtn = findViewById(R.id.botaoVenderTodas);

        jogador = new JogadorManager(this);

        configurarFiltro();
        carregarCartas();
        atualizarOuro();

        voltarBtn.setOnClickListener(v -> {
            startActivity(new Intent(ColecaoActivity.this, MainActivity.class));
            finish();
        });

        lojaBtn.setOnClickListener(v -> startActivity(new Intent(ColecaoActivity.this, LojaActivity.class)));

        // O botão agora abre o novo diálogo com "Todas" incluída
        venderTodasBtn.setOnClickListener(v -> abrirDialogSelecaoRaridades());
    }

    private void abrirDialogSelecaoRaridades() {
        boolean[] selecionadas = new boolean[raridades.length];

        new AlertDialog.Builder(this)
                .setTitle("Seleciona as raridades a vender:")
                .setMultiChoiceItems(raridades, selecionadas, (dialog, which, isChecked) -> {
                    // Se o jogador marcar "Todas", desmarca as outras
                    if (which == 0 && isChecked) {
                        for (int i = 1; i < selecionadas.length; i++) {
                            selecionadas[i] = false;
                            ((AlertDialog) dialog).getListView().setItemChecked(i, false);
                        }
                    } else if (which > 0 && isChecked) {
                        // Se marcar uma específica, desmarca "Todas"
                        selecionadas[0] = false;
                        ((AlertDialog) dialog).getListView().setItemChecked(0, false);
                    }
                    selecionadas[which] = isChecked;
                })
                .setPositiveButton("Vender", (dialog, which) -> {
                    List<String> raridadesEscolhidas = new ArrayList<>();
                    for (int i = 0; i < raridades.length; i++) {
                        if (selecionadas[i]) {
                            raridadesEscolhidas.add(raridades[i]);
                        }
                    }

                    if (raridadesEscolhidas.isEmpty()) {
                        Toast.makeText(this, "Seleciona pelo menos uma raridade.", Toast.LENGTH_SHORT).show();
                        return;
                    }

                    // Se "Todas" for escolhida, ignora as outras e vende tudo
                    if (raridadesEscolhidas.contains("Todas")) {
                        confirmarVendaTodas();
                    } else {
                        confirmarVendaVariasRaridades(raridadesEscolhidas);
                    }
                })
                .setNegativeButton("Cancelar", null)
                .show();
    }

    private void confirmarVendaTodas() {
        new AlertDialog.Builder(this)
                .setTitle("Confirmar venda")
                .setMessage("Tens a certeza que queres vender TODAS as tuas cartas?")
                .setPositiveButton("Sim", (dialog, which) -> venderTodas())
                .setNegativeButton("Cancelar", null)
                .show();
    }

    private void confirmarVendaVariasRaridades(List<String> raridadesEscolhidas) {
        new AlertDialog.Builder(this)
                .setTitle("Confirmar venda")
                .setMessage("Vender todas as cartas das raridades: " +
                        String.join(", ", raridadesEscolhidas) + "?")
                .setPositiveButton("Sim", (dialog, which) -> venderVariasRaridades(raridadesEscolhidas))
                .setNegativeButton("Cancelar", null)
                .show();
    }

    private void venderTodas() {
        int totalGanho = 0;
        DbHelper dbHelper = new DbHelper(this);
        SQLiteDatabase db = dbHelper.getWritableDatabase();

        for (Carta carta : new ArrayList<>(listaCartas)) {
            totalGanho += calcularValorPorRaridade(carta.getRaridade());
            db.delete("colecao", "id=?", new String[]{String.valueOf(carta.getId())});
        }

        listaCartas.clear();
        db.close();

        jogador.adicionarOuro(totalGanho);
        adapter.notifyDataSetChanged();
        atualizarOuro();

        Toast.makeText(this, "Vendeste TODAS as cartas! +" +
                JogadorManager.formatarOuro(totalGanho) + " ouro ganho!", Toast.LENGTH_LONG).show();
    }

    private void venderVariasRaridades(List<String> raridadesEscolhidas) {
        int totalGanho = 0;
        DbHelper dbHelper = new DbHelper(this);
        SQLiteDatabase db = dbHelper.getWritableDatabase();

        Iterator<Carta> iterator = listaCartas.iterator();
        while (iterator.hasNext()) {
            Carta carta = iterator.next();
            if (raridadesEscolhidas.contains(carta.getRaridade())) {
                totalGanho += calcularValorPorRaridade(carta.getRaridade());
                db.delete("colecao", "id=?", new String[]{String.valueOf(carta.getId())});
                iterator.remove();
            }
        }
        db.close();

        jogador.adicionarOuro(totalGanho);
        adapter.notifyDataSetChanged();
        atualizarOuro();

        Toast.makeText(this, "Vendeste cartas (" + JogadorManager.formatarOuro(totalGanho) +
                " ouro ganho)", Toast.LENGTH_LONG).show();
    }

    private void atualizarOuro() {
        textoOuro.setText("Ouro: " + JogadorManager.formatarOuro(jogador.getOuro()));
    }

    private void carregarCartas() {
        listaCartas = new ArrayList<>();
        DbHelper dbHelper = new DbHelper(this);
        SQLiteDatabase db = dbHelper.getReadableDatabase();

        String query = "SELECT id, nome, raridade, imagem FROM colecao";
        if (!raridadeSelecionada.equals("Todas")) {
            query += " WHERE raridade='" + raridadeSelecionada + "'";
        }

        Cursor cursor = db.rawQuery(query, null);
        if (cursor.moveToFirst()) {
            do {
                Carta carta = new Carta(
                        cursor.getInt(0),
                        cursor.getString(1),
                        cursor.getString(2),
                        cursor.getString(3)
                );
                listaCartas.add(carta);
            } while (cursor.moveToNext());
        }

        cursor.close();
        db.close();

        adapter = new CartaAdapter(this, listaCartas, this::confirmarVendaCarta);
        gridView.setAdapter(adapter);
    }

    private void confirmarVendaCarta(Carta carta) {
        if (carta.getRaridade().equals("Épica") ||
                carta.getRaridade().equals("Lendária") ||
                carta.getRaridade().equals("Especial")) {

            new AlertDialog.Builder(this)
                    .setTitle("Confirmar venda")
                    .setMessage("Tens a certeza que queres vender a carta " +
                            carta.getNome() + " (" + carta.getRaridade() + ")?")
                    .setPositiveButton("Sim", (dialog, which) -> venderCarta(carta))
                    .setNegativeButton("Cancelar", null)
                    .show();
        } else {
            venderCarta(carta);
        }
    }

    private void venderCarta(Carta carta) {
        int valorVenda = calcularValorPorRaridade(carta.getRaridade());
        jogador.adicionarOuro(valorVenda);

        DbHelper dbHelper = new DbHelper(this);
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        db.delete("colecao", "id=?", new String[]{String.valueOf(carta.getId())});
        db.close();

        listaCartas.remove(carta);
        adapter.notifyDataSetChanged();
        atualizarOuro();

        Toast.makeText(this, "Carta vendida com sucesso!", Toast.LENGTH_SHORT).show();
    }

    private int calcularValorPorRaridade(String raridade) {
        switch (raridade) {
            case "Comum": return 10;
            case "Incomum": return 25;
            case "Rara": return 50;
            case "Épica": return 100;
            case "Lendária": return 200;
            case "Especial": return 500;
            default: return 0;
        }
    }

    private void configurarFiltro() {
        String[] opcoes = {"Todas", "Comum", "Incomum", "Rara", "Épica", "Lendária", "Especial"};
        ArrayAdapter<String> adapterFiltro = new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item, opcoes);
        filtroSpinner.setAdapter(adapterFiltro);

        filtroSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                raridadeSelecionada = opcoes[position];
                carregarCartas();
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {}
        });
    }
}










