package com.example.boidelov3;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.os.Bundle;
import android.text.Editable;
import android.text.InputType;
import android.text.TextWatcher;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import com.google.android.material.textfield.TextInputEditText;

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


public class MainActivity extends AppCompatActivity {

    String J1S, J2S, J3S;
    private int offset;
    private List<String> toutlesjoueurs;
    private TextInputEditText J1;
    private TextInputEditText J2;
    private TextInputEditText J3;
    private List<TextInputEditText> editTextList = new ArrayList<>();
    private List<View> playerRowList = new ArrayList<>(); // Liste des lignes de joueurs pour suppression
    private TextView playerCountText;

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

        // Récupérer le TextView du compteur
        playerCountText = findViewById(R.id.playerCountText);

        // Initialiser les 3 champs statiques et ajouter les listeners
        J1 = findViewById(R.id.J1);
        J2 = findViewById(R.id.J2);
        J3 = findViewById(R.id.J3);

        // Ajouter un TextWatcher à chaque champ pour mettre à jour le compteur
        TextWatcher playerCountWatcher = new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                updatePlayerCount();
            }

            @Override
            public void afterTextChanged(Editable s) {}
        };

        if (J1 != null) J1.addTextChangedListener(playerCountWatcher);
        if (J2 != null) J2.addTextChangedListener(playerCountWatcher);
        if (J3 != null) J3.addTextChangedListener(playerCountWatcher);

        // Mise à jour initiale
        updatePlayerCount();
    }

    /**
     * Met à jour le compteur de joueurs en temps réel
     */
    private void updatePlayerCount() {
        int count = 0;
        if (J1 != null && J1.getText() != null && !J1.getText().toString().isEmpty()) count++;
        if (J2 != null && J2.getText() != null && !J2.getText().toString().isEmpty()) count++;
        if (J3 != null && J3.getText() != null && !J3.getText().toString().isEmpty()) count++;

        // Compter les champs dynamiques
        for (TextInputEditText edit : editTextList) {
            if (edit != null && edit.getText() != null && !edit.getText().toString().isEmpty()) {
                count++;
            }
        }

        if (playerCountText != null) {
            playerCountText.setText("Joueurs: " + count + " / min. 3");
        }
    }

    public void onClickButton1(View view) {
        LinearLayout nameEntryLayout = findViewById(R.id.nameEntryLayout);

        // Créer un conteneur pour la ligne de joueur (EditText + Bouton supprimer)
        FrameLayout playerRow = new FrameLayout(this);
        LinearLayout.LayoutParams rowParams = new LinearLayout.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.WRAP_CONTENT
        );
        rowParams.setMargins(0, 0, 0, 12); // Marge identique aux champs statiques (12dp)
        playerRow.setLayoutParams(rowParams);

        // Créer un nouveau TextInputLayout
        com.google.android.material.textfield.TextInputLayout textInputLayout = new com.google.android.material.textfield.TextInputLayout(this);
        FrameLayout.LayoutParams textInputParams = new FrameLayout.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.WRAP_CONTENT
        );
        // Plus d'espace pour le bouton poubelle (68dp au lieu de 52dp)
        textInputParams.setMargins(0, 0, 68, 0);
        textInputLayout.setLayoutParams(textInputParams);
        textInputLayout.setBoxBackgroundMode(com.google.android.material.textfield.TextInputLayout.BOX_BACKGROUND_OUTLINE);
        textInputLayout.setHint("Nom");

        // Appliquer exactement les mêmes styles que le XML
        // Créer un ColorStateList pour la bordure : grise par défaut, primaire quand focus
        int[][] states = new int[][] {
                new int[] { android.R.attr.state_focused},
                new int[] {}
        };
        int[] colors = new int[] {
                androidx.core.content.ContextCompat.getColor(this, R.color.primary),
                androidx.core.content.ContextCompat.getColor(this, android.R.color.darker_gray) // Bordure grise par défaut
        };
        android.content.res.ColorStateList strokeColorStateList = new android.content.res.ColorStateList(states, colors);
        textInputLayout.setBoxStrokeColorStateList(strokeColorStateList);
        textInputLayout.setBoxStrokeWidth(2); // Largeur de bordure comme dans le XML
        textInputLayout.setBoxBackgroundColor(androidx.core.content.ContextCompat.getColor(this, R.color.surface));
        textInputLayout.setDefaultHintTextColor(androidx.core.content.ContextCompat.getColorStateList(this, R.color.text_hint));
        textInputLayout.setEndIconMode(com.google.android.material.textfield.TextInputLayout.END_ICON_CLEAR_TEXT);

        // Créer un nouveau TextInputEditText
        TextInputEditText newEditText = new TextInputEditText(this);
        newEditText.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
        newEditText.setInputType(InputType.TYPE_TEXT_FLAG_CAP_WORDS);
        newEditText.setMaxLines(1);
        newEditText.setTextSize(16);
        newEditText.setTextColor(androidx.core.content.ContextCompat.getColor(this, R.color.text_primary));
        newEditText.setHintTextColor(androidx.core.content.ContextCompat.getColor(this, R.color.text_hint));

        // Ajouter un TextWatcher pour mettre à jour le compteur en temps réel
        newEditText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                updatePlayerCount();
            }

            @Override
            public void afterTextChanged(Editable s) {}
        });

        // Ajouter l'EditText au TextInputLayout
        textInputLayout.addView(newEditText);

        // Créer le bouton de suppression - style élégant avec fond circulaire
        ImageButton deleteButton = new ImageButton(this);
        int dp40 = (int) (40 * getResources().getDisplayMetrics().density);
        FrameLayout.LayoutParams buttonParams = new FrameLayout.LayoutParams(dp40, dp40);
        buttonParams.setMargins(0, 0, 8, 0);
        buttonParams.gravity = android.view.Gravity.END | android.view.Gravity.CENTER_VERTICAL;
        deleteButton.setLayoutParams(buttonParams);

        // Utiliser l'icône de poubelle Material (ic_menu_delete est une croix)
        deleteButton.setImageResource(android.R.drawable.ic_menu_delete);
        deleteButton.setColorFilter(androidx.core.content.ContextCompat.getColor(this, R.color.text_secondary));
        deleteButton.setScaleType(ImageButton.ScaleType.CENTER_INSIDE);

        // Fond circulaire blanc avec bordure fine
        deleteButton.setBackgroundColor(androidx.core.content.ContextCompat.getColor(this, R.color.white));
        deleteButton.setPadding(8, 8, 8, 8);

        // Arrondir le bouton en cercle via un OutlineProvider
        deleteButton.setOutlineProvider(new android.view.ViewOutlineProvider() {
            @Override
            public void getOutline(android.view.View view, android.graphics.Outline outline) {
                outline.setOval(0, 0, view.getWidth(), view.getHeight());
            }
        });
        deleteButton.setClipToOutline(true);

        deleteButton.setContentDescription("Supprimer ce joueur");

        // Configuration du bouton de suppression avec animation
        deleteButton.setOnClickListener(v -> removePlayerRow(playerRow, newEditText));

        // Ajouter les éléments au conteneur
        playerRow.addView(textInputLayout);
        playerRow.addView(deleteButton);

        // Ajouter à la liste et au layout avec animation
        editTextList.add(newEditText);
        playerRowList.add(playerRow);
        nameEntryLayout.addView(playerRow);

        // Animation d'apparition
        BoideloAnimationUtils.popIn(playerRow, 300);
        BoideloAnimationUtils.triggerHapticFeedback(this);
    }

    /**
     * Supprime une ligne de joueur avec animation
     */
    private void removePlayerRow(View playerRow, TextInputEditText editText) {
        BoideloAnimationUtils.triggerHapticFeedback(this);

        // Animation de suppression
        BoideloAnimationUtils.slideOutToRemove(playerRow, 300, () -> {
            // Retirer de la liste et du layout après l'animation
            editTextList.remove(editText);
            playerRowList.remove(playerRow);
            ViewGroup parent = (ViewGroup) playerRow.getParent();
            if (parent != null) {
                parent.removeView(playerRow);
            }
            // Mettre à jour le compteur après suppression
            updatePlayerCount();
        });
    }


    public void onClickButtonStart(View view) {
        // Récupérer les 3 premiers champs de saisie
        J1 = findViewById(R.id.J1);
        if (J1 != null && J1.getText() != null) {
            J1S = J1.getText().toString();
        } else {
            J1S = "";
        }

        J2 = findViewById(R.id.J2);
        if (J2 != null && J2.getText() != null) {
            J2S = J2.getText().toString();
        } else {
            J2S = "";
        }

        J3 = findViewById(R.id.J3);
        if (J3 != null && J3.getText() != null) {
            J3S = J3.getText().toString();
        } else {
            J3S = "";
        }

        // Creation d'une liste avec tt les j et verif si elle est completé
        toutlesjoueurs = new ArrayList<>();
        if (!J1S.isEmpty()) {
            toutlesjoueurs.add(J1S);
        }
        if (!J2S.isEmpty()) {
            toutlesjoueurs.add(J2S);
        }
        if (!J3S.isEmpty()) {
            toutlesjoueurs.add(J3S);
        }

        // Ajouter les champs dynamiques
        int nbnom = editTextList.size();
        for (int i = 0; i < nbnom; i++) {
            TextInputEditText editText = editTextList.get(i);
            if (editText != null && editText.getText() != null) {
                String nom = editText.getText().toString();
                if (!nom.isEmpty()) {
                    toutlesjoueurs.add(nom);
                }
            }
        }

        openParametres();
    }

    public void openParametres(){
        // Vérifier s'il y a des noms en double (insensible à la casse)
        List<String> nomsNormauxes = new ArrayList<>();
        for (String nom : toutlesjoueurs) {
            String nomNormalise = nom.trim().toLowerCase();
            if (nomsNormauxes.contains(nomNormalise)) {
                // Nom en double détecté
                Context context = getApplicationContext();
                CharSequence text = "Erreur : Le nom \"" + nom + "\" est utilisé plusieurs fois. Chaque joueur doit avoir un nom unique.";
                int duration = Toast.LENGTH_LONG;
                Toast toast = Toast.makeText(context, text, duration);
                toast.show();
                return; // Ne pas continuer
            }
            nomsNormauxes.add(nomNormalise);
        }

        //enregistrement des joueurs dans les shared preferences Joueurs
        SharedPreferences sharedPreferences = getSharedPreferences("Joueurs", Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();

        editor.putString("J1", J1S != null ? J1S : "");
        editor.putString("J2", J2S != null ? J2S : "");
        editor.putString("J3", J3S != null ? J3S : "");

        for (int i = 0; i < editTextList.size(); i++) {
            TextInputEditText editText = editTextList.get(i);
            if (editText != null && editText.getText() != null) {
                String nom = editText.getText().toString();
                editor.putString("J" + (i + 4), nom);
            }
        }

        editor.apply();
        //Lancement de l'activité (Jeux_parametres)

        Intent intent = new Intent(this, JeuxParametres.class);
        //Regarde si le pseudo est vide et envoie à l'activité jeux
        if (toutlesjoueurs.isEmpty()){
            Context context = getApplicationContext();
            CharSequence text = "Merci de rentrer des joueurs";
            int duration = Toast.LENGTH_SHORT;

            Toast toast = Toast.makeText(context, text, duration);
            toast.show();
        }
        else {
            if (toutlesjoueurs.size() >= 3) {
                intent.putStringArrayListExtra("EXTRA_LIST_JOUEUR", (ArrayList<String>) toutlesjoueurs);
                intent.putExtra("EXTRA_OFFSET", offset);
                startActivity(intent);
            } else {
                Context context = getApplicationContext();
                CharSequence text = "La partie ne peut pas commencer avec moins de 3 joueurs";
                int duration = Toast.LENGTH_SHORT;
                Toast toast = Toast.makeText(context, text, duration);
                toast.show();

            }
        }
    }
}
