package com.example.tcg;

import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

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

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

public class PacotesActivity extends AppCompatActivity {

    private FloatingActionButton voltarFloatingActionButton;
    private Button botaoAbrirPacote;
    private ImageView imagemPacote;
    private TextView textoInventario;

    private boolean pacoteAberto = false;
    private List<CartaComProbabilidade> cartasDisponiveis;
    private JogadorManager jogador;

    @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_pacotes);

        voltarFloatingActionButton = findViewById(R.id.voltarFloatingActionButton);
        botaoAbrirPacote = findViewById(R.id.botaoAbrirPacote);
        imagemPacote = findViewById(R.id.imagemPacote);
        textoInventario = findViewById(R.id.textoInventario);

        jogador = new JogadorManager(this);
        atualizarInventario();

        inicializarCartas();

        voltarFloatingActionButton.setOnClickListener(v -> {
            Intent intent = new Intent(PacotesActivity.this, MainActivity.class);
            startActivity(intent);
            finish();
        });

        botaoAbrirPacote.setOnClickListener(v -> abrirPacote());
    }

    //Se quisermos inserir alguma carta nova é só colcoar aqui
    private void inicializarCartas() {
        cartasDisponiveis = new ArrayList<>();
        cartasDisponiveis.add(new CartaComProbabilidade(new Carta("Catch'em All!", "Comum", "peaceful_morning"), 0.4));
        cartasDisponiveis.add(new CartaComProbabilidade(new Carta("Evolve", "Comum", "eevelutions"), 0.4));
        cartasDisponiveis.add(new CartaComProbabilidade(new Carta("Give It Your All", "Comum", "boyfriend"), 0.4));
        cartasDisponiveis.add(new CartaComProbabilidade(new Carta("Surgeon of Death", "Incomum", "surgeon"), 0.30));
        cartasDisponiveis.add(new CartaComProbabilidade(new Carta("Bites the Dust", "Incomum", "killerqueen"), 0.30));
        cartasDisponiveis.add(new CartaComProbabilidade(new Carta("Altruist Heart", "Incomum", "tanjiro"), 0.30));
        cartasDisponiveis.add(new CartaComProbabilidade(new Carta("The Fastest Blue", "Rara", "sonicrevamp"), 0.20));
        cartasDisponiveis.add(new CartaComProbabilidade(new Carta("Ferrous Faker", "Rara", "fake"), 0.20));
        cartasDisponiveis.add(new CartaComProbabilidade(new Carta("Drums Of Liberation", "Épica", "luffy"), 0.10));
        cartasDisponiveis.add(new CartaComProbabilidade(new Carta("Aura Farmer", "Épica", "piccolo"), 0.10));
        cartasDisponiveis.add(new CartaComProbabilidade(new Carta("The Crew", "Lendária", "thecrew"), 0.05));
        cartasDisponiveis.add(new CartaComProbabilidade(new Carta("Another Tale For the Next Dreamer", "Lendária", "lucydavid"), 0.05));
        cartasDisponiveis.add(new CartaComProbabilidade(new Carta("Bravery", "Especial", "bravery"), 0.005));
        cartasDisponiveis.add(new CartaComProbabilidade(new Carta("Kindness", "Especial", "kindness"), 0.005));
        cartasDisponiveis.add(new CartaComProbabilidade(new Carta("Integrity", "Especial", "integrity"), 0.005));
        cartasDisponiveis.add(new CartaComProbabilidade(new Carta("Perseverance", "Especial", "perseverance"), 0.005));
        cartasDisponiveis.add(new CartaComProbabilidade(new Carta("Determination", "Especial", "determination"), 0.005));
        cartasDisponiveis.add(new CartaComProbabilidade(new Carta("Patience", "Especial", "patience"), 0.005));
        cartasDisponiveis.add(new CartaComProbabilidade(new Carta("Justice", "Especial", "justice"), 0.005));

    }

    //Tudo aquilo que acontece quando clicamos pra abrir pacote
    private void abrirPacote() {
        if (pacoteAberto) return;

        int totalCartas = contarCartasNaColecao();
        int limite = jogador.getLimiteCartas();

        if (totalCartas >= limite) {
            Toast.makeText(this, "⚠ Inventário cheio! Venda cartas ou aumente o limite na loja.", Toast.LENGTH_LONG).show();
            return;
        }

        pacoteAberto = true;
        botaoAbrirPacote.setEnabled(false);

        Carta cartaEscolhida = escolherCartaPorRaridade();
        guardarCartaNaColecao(cartaEscolhida.getNome(), cartaEscolhida.getRaridade(), cartaEscolhida.getImagem());
        mostrarCartaGanha(cartaEscolhida);
        botaoAbrirPacote.setText("Abrir outro pacote");
        botaoAbrirPacote.setEnabled(true);
        pacoteAberto = false;
        atualizarInventario();

    }

    private Carta escolherCartaPorRaridade() {
        double random = Math.random();
        double acumulado = 0.0;

        int multiplicador = jogador.getMultiplicadorSorte();
        List<Double> probAjustada = new ArrayList<>();
        double soma = 0;

        for (CartaComProbabilidade cartaProb : cartasDisponiveis) {
            double chance = cartaProb.getProbabilidade();

            if (cartaProb.getCarta().getRaridade().equals("Épica") ||
                    cartaProb.getCarta().getRaridade().equals("Lendária")) {
                chance *= multiplicador;
            }

            probAjustada.add(chance);
            soma += chance;
        }

        for (int i = 0; i < probAjustada.size(); i++) {
            probAjustada.set(i, probAjustada.get(i) / soma);
        }

        for (int i = 0; i < cartasDisponiveis.size(); i++) {
            acumulado += probAjustada.get(i);
            if (random <= acumulado) {
                return cartasDisponiveis.get(i).getCarta();
            }
        }

        return cartasDisponiveis.get(cartasDisponiveis.size() - 1).getCarta();
    }

    private void guardarCartaNaColecao(String nome, String raridade, String imagem) {
        DbHelper dbHelper = new DbHelper(this);
        SQLiteDatabase db = dbHelper.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put("nome", nome);
        values.put("raridade", raridade);
        values.put("imagem", imagem);

        db.insert("colecao", null, values);
        db.close();
    }

    private int contarCartasNaColecao() {
        DbHelper dbHelper = new DbHelper(this);
        SQLiteDatabase db = dbHelper.getReadableDatabase();

        Cursor cursor = db.rawQuery("SELECT COUNT(*) FROM colecao", null);
        int count = 0;
        if (cursor.moveToFirst()) count = cursor.getInt(0);
        cursor.close();
        db.close();
        return count;
    }

    private void atualizarInventario() {
        DbHelper dbHelper = new DbHelper(this);
        SQLiteDatabase db = dbHelper.getReadableDatabase();

        Cursor cursor = db.rawQuery("SELECT COUNT(*) FROM colecao", null);
        int totalCartas = 0;
        if (cursor.moveToFirst()) totalCartas = cursor.getInt(0);
        cursor.close();
        db.close();

        int limite = jogador.getLimiteCartas();
        textoInventario.setText("Inventário: " + totalCartas + " / " + limite);

        if (totalCartas >= limite) {
            textoInventario.setTextColor(getResources().getColor(android.R.color.holo_red_dark));
            textoInventario.setText("Inventário Cheio!");
        } else {
            textoInventario.setTextColor(getResources().getColor(android.R.color.black));
        }
    }
    private void mostrarCartaGanha(Carta carta) {
        // Mostra a carta depois de abrir pacote
        FrameLayout container = findViewById(R.id.containerCartaObtida);
        container.setVisibility(View.VISIBLE);
        container.removeAllViews();

        // Infla o layout da carta
        View view = getLayoutInflater().inflate(R.layout.item_carta_ganha, container, false);

        ImageView imagemCarta = view.findViewById(R.id.imagemCarta);
        TextView textoNome = view.findViewById(R.id.textoNomeCarta);
        TextView textoRaridade = view.findViewById(R.id.textoRaridade);
        View cartaLayout = view.findViewById(R.id.cartaLayout);

        // Define texto e imagem
        textoNome.setText(carta.getNome());
        textoRaridade.setText(carta.getRaridade());

        int resId = getResources().getIdentifier(carta.getImagem(), "drawable", getPackageName());
        imagemCarta.setImageResource(resId);

        // Ajusta proporções da imagem
        imagemCarta.setAdjustViewBounds(true);
        imagemCarta.setScaleType(ImageView.ScaleType.FIT_CENTER);



        // Aplica borda conforme raridade
        switch (carta.getRaridade()) {
            case "Comum":
                cartaLayout.setBackgroundResource(R.drawable.borda_comum);
                textoRaridade.setTextColor(Color.parseColor("#607D8B"));
                break;
            case "Incomum":
                cartaLayout.setBackgroundResource(R.drawable.borda_incomum);
                textoRaridade.setTextColor(Color.parseColor("#4CAF50"));
                break;
            case "Rara":
                cartaLayout.setBackgroundResource(R.drawable.borda_rara);
                textoRaridade.setTextColor(Color.parseColor("#7E57C2"));
                break;
            case "Épica":
                cartaLayout.setBackgroundResource(R.drawable.borda_epica);
                textoRaridade.setTextColor(Color.parseColor("#6A1B9A"));
                break;
            case "Lendária":
                cartaLayout.setBackgroundResource(R.drawable.borda_lendaria);
                textoRaridade.setTextColor(Color.parseColor("#FFD600"));
                break;
            case "Especial":
                cartaLayout.setBackgroundResource(R.drawable.borda_especial);
                textoRaridade.setTextColor(Color.parseColor("#ef736c"));
                break;
        }

        // Animação (XML + interpolação)
        Animation anim = AnimationUtils.loadAnimation(this, R.anim.reveal_card);
        view.startAnimation(anim);
        if (carta.getRaridade().equals("Lendária") || carta.getRaridade().equals("Especial")) {
            view.setElevation(20f); // brilho leve da sombra
            view.animate().rotationYBy(15).setDuration(300).withEndAction(() ->
                    view.animate().rotationY(0).setDuration(300)
            ).start();
        }
        // Adiciona a carta ao container
        container.addView(view);

    }



}




