package com.example.boidelov3;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.animation.DecelerateInterpolator;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;

import com.example.boidelov3.data.PlayerStats;
import com.google.android.material.button.MaterialButton;

import java.util.ArrayList;

/**
 * Activité de fin de partie
 * Affiche un résumé de la partie et permet de rejouer ou retourner à l'accueil
 */
public class EndGameActivity extends AppCompatActivity {

    // Vues
    private TextView questionsPlayedValue;
    private TextView playersCountValue;
    private TextView gorgeesTotalValue;
    private TextView plusBuValue;
    private TextView plusDistribueValue;
    private MaterialButton homeButton;
    private MaterialButton replayButton;

    // Données
    private int questionsPlayed;
    private int playersCount;
    private ArrayList<String> players;
    private ArrayList<PlayerStats> playerStatsList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_end_game);

        // Initialiser les vues
        initViews();

        // Récupérer les données de la partie
        getGameData();

        // Afficher les statistiques
        displayStats();

        // Configurer les boutons
        setupButtons();

        // Animations d'entrée
        animateEntry();
    }

    /**
     * Initialise toutes les vues
     */
    private void initViews() {
        questionsPlayedValue = findViewById(R.id.questionsPlayedValue);
        playersCountValue = findViewById(R.id.playersCountValue);
        gorgeesTotalValue = findViewById(R.id.gorgeesTotalValue);
        plusBuValue = findViewById(R.id.plusBuValue);
        plusDistribueValue = findViewById(R.id.plusDistribueValue);
        homeButton = findViewById(R.id.homeButton);
        replayButton = findViewById(R.id.replayButton);

        // Appliquer les animations aux boutons
        BoideloAnimationUtils.applyButtonPressAnimation(homeButton);
        BoideloAnimationUtils.applyButtonPressAnimation(replayButton);
    }

    /**
     * Récupère les données de la partie terminée
     */
    private void getGameData() {
        // Récupérer les données depuis l'intent
        questionsPlayed = getIntent().getIntExtra("EXTRA_QUESTIONS_PLAYED", 0);
        playersCount = getIntent().getIntExtra("EXTRA_PLAYERS_COUNT", 0);
        players = getIntent().getStringArrayListExtra("EXTRA_PLAYERS");

        // Récupérer les statistiques des joueurs
        playerStatsList = getIntent().getParcelableArrayListExtra("PLAYER_STATS");

        // Si pas de données, utiliser les SharedPreferences
        if (questionsPlayed == 0) {
            android.content.SharedPreferences prefs = getSharedPreferences("game_stats", Context.MODE_PRIVATE);
            questionsPlayed = prefs.getInt("questions_played", 0);
            playersCount = prefs.getInt("players_count", 0);
        }
    }

    /**
     * Affiche les statistiques de la partie
     */
    private void displayStats() {
        // Animer les chiffres
        animateValue(questionsPlayedValue, 0, questionsPlayed, 1000);
        animateValue(playersCountValue, 0, playersCount, 1000);

        // Calculer et afficher les statistiques détaillées
        if (playerStatsList != null && !playerStatsList.isEmpty()) {
            // Calculer le total des gorgées bues
            int totalGorgeesBuves = 0;
            PlayerStats biggestDrinker = null;
            int maxGorgeesBuves = -1;

            PlayerStats biggestDistributor = null;
            int maxGorgeesDistribuees = -1;

            for (PlayerStats stats : playerStatsList) {
                totalGorgeesBuves += stats.getGorgeesBuves();

                // Trouver le plus gros buveur
                if (stats.getGorgeesBuves() > maxGorgeesBuves) {
                    maxGorgeesBuves = stats.getGorgeesBuves();
                    biggestDrinker = stats;
                }

                // Trouver le plus gros distributeur
                if (stats.getGorgeesDistribuees() > maxGorgeesDistribuees) {
                    maxGorgeesDistribuees = stats.getGorgeesDistribuees();
                    biggestDistributor = stats;
                }
            }

            // Afficher le total des gorgées bues
            animateValue(gorgeesTotalValue, 0, totalGorgeesBuves, 1000);

            // Afficher le joueur qui a le plus bu
            if (biggestDrinker != null && biggestDrinker.getGorgeesBuves() > 0) {
                plusBuValue.setText(biggestDrinker.getPlayerName() + " (" + biggestDrinker.getGorgeesBuves() + ")");
            } else {
                plusBuValue.setText("Personne");
            }

            // Afficher le joueur qui a le plus distribué
            if (biggestDistributor != null && biggestDistributor.getGorgeesDistribuees() > 0) {
                plusDistribueValue.setText(biggestDistributor.getPlayerName() + " (" + biggestDistributor.getGorgeesDistribuees() + ")");
            } else {
                plusDistribueValue.setText("Personne");
            }
        } else {
            // Pas de stats disponibles
            gorgeesTotalValue.setText("0");
            plusBuValue.setText("Personne");
            plusDistribueValue.setText("Personne");
        }

        // Afficher un message de félicitations
        showCongratulationMessage();
    }

    /**
     * Affiche un message de félicitations selon le nombre de questions
     */
    private void showCongratulationMessage() {
        // Le message pourrait être personnalisé selon les performances
        // Pour l'instant, on utilise le titre par défaut du layout
    }

    /**
     * Configure les boutons
     */
    private void setupButtons() {
        homeButton.setOnClickListener(v -> {
            BoideloAnimationUtils.triggerHapticFeedback(this);
            goToHome();
        });

        replayButton.setOnClickListener(v -> {
            BoideloAnimationUtils.triggerSuccessHaptic(this);
            replay();
        });
    }

    /**
     * Retourne à l'écran d'accueil (hub de jeux)
     */
    private void goToHome() {
        Intent intent = new Intent(this, com.example.boidelov3.hub.GameSelectionActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
        finish();
    }

    /**
     * Relance une nouvelle partie (retourne au hub)
     */
    private void replay() {
        Intent intent = new Intent(this, com.example.boidelov3.hub.GameSelectionActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
        finish();
    }

    /**
     * Anime l'entrée des éléments
     */
    private void animateEntry() {
        // Animation du trophée
        View trophyIcon = findViewById(R.id.trophyIcon);
        BoideloAnimationUtils.scale(trophyIcon, 1.0f, 400);

        // Animation fade-in pour le contenu
        View titleText = findViewById(R.id.titleText);
        View subtitleText = findViewById(R.id.subtitleText);

        BoideloAnimationUtils.fadeIn(titleText, 600);
        BoideloAnimationUtils.fadeIn(subtitleText, 800);
    }

    /**
     * Anime un chiffre de 0 à la valeur cible
     */
    private void animateValue(TextView textView, int start, int end, int duration) {
        if (textView == null) return;

        android.animation.ValueAnimator animator = android.animation.ValueAnimator.ofInt(start, end);
        animator.setDuration(duration);
        animator.setInterpolator(new DecelerateInterpolator());

        animator.addUpdateListener(animation -> {
            int value = (int) animation.getAnimatedValue();
            textView.setText(String.valueOf(value));
        });

        animator.start();
    }

    @Override
    public void onBackPressed() {
        // Retourner à l'accueil au lieu de revenir au jeu
        goToHome();
    }
}
