package com.example.boidelov3.games.boideloclassic.manager;

import android.app.Activity;
import android.view.LayoutInflater;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.example.boidelov3.R;
import com.google.android.material.button.MaterialButton;
import com.google.android.material.textfield.TextInputEditText;
import java.util.ArrayList;

/**
 * BoideloPlayerRowManager - Gestionnaire des lignes de saisie de joueurs
 * Cette classe gère l'ajout et la suppression dynamique de champs de saisie
 * avec Material Design
 */
public class BoideloPlayerRowManager {
    
    private Activity activity;
    private LinearLayout nameEntryLayout;
    private BoideloPlayerManager playerManager;
    private ArrayList<LinearLayout> playerRowList;
    private ArrayList<TextInputEditText> editTextList;
    
    private int offset = 4; // Nombre initial de joueurs fixes (J1, J2, J3)
    
    public BoideloPlayerRowManager(Activity activity, LinearLayout nameEntryLayout, 
                                   BoideloPlayerManager playerManager) {
        this.activity = activity;
        this.nameEntryLayout = nameEntryLayout;
        this.playerManager = playerManager;
        this.playerRowList = new ArrayList<>();
        this.editTextList = new ArrayList<>();
    }
    
    /**
     * Ajoute une nouvelle ligne de saisie pour un joueur
     */
    public void addPlayerRow() {
        // Inflate le layout Material Design
        LayoutInflater inflater = LayoutInflater.from(activity);
        LinearLayout newRow = (LinearLayout) inflater.inflate(R.layout.item_player_row, nameEntryLayout, false);
        
        // Configure le numéro du joueur
        TextView playerNumber = newRow.findViewById(R.id.playerNumber);
        playerNumber.setText(String.valueOf(offset));
        
        // Récupère le champ de saisie
        TextInputEditText editText = newRow.findViewById(R.id.playerName);
        editText.setHint("Joueur " + offset);
        editTextList.add(editText);
        
        // Configure le bouton de suppression
        MaterialButton removeButton = newRow.findViewById(R.id.removePlayerButton);
        removeButton.setOnClickListener(v -> removePlayerRow(newRow));
        
        // Ajoute la ligne au conteneur
        nameEntryLayout.addView(newRow);
        playerRowList.add(newRow);
        offset++;
        
        // Notifie le gestionnaire de joueurs
        playerManager.addPlayer("");
    }
    
    /**
     * Supprime une ligne de joueur
     * @param row La ligne à supprimer
     */
    public void removePlayerRow(LinearLayout row) {
        int index = playerRowList.indexOf(row);
        if (index >= 0) {
            nameEntryLayout.removeView(row);
            playerRowList.remove(index);
            if (index < editTextList.size()) {
                editTextList.remove(index);
            }
            offset--;
            
            // Met à jour les numéros de joueurs
            updatePlayerNumbers();
        }
    }
    
    /**
     * Met à jour les numéros affichés pour tous les joueurs
     */
    private void updatePlayerNumbers() {
        for (int i = 0; i < playerRowList.size(); i++) {
            LinearLayout row = playerRowList.get(i);
            TextView playerNumber = row.findViewById(R.id.playerNumber);
            if (playerNumber != null) {
                playerNumber.setText(String.valueOf(4 + i));
            }
        }
    }
    
    /**
     * Retourne les noms des joueurs depuis les champs dynamiques
     * @return La liste des noms des joueurs
     */
    public ArrayList<String> getPlayerNames() {
        ArrayList<String> names = new ArrayList<>();
        for (TextInputEditText editText : editTextList) {
            String name = editText.getText() != null ? editText.getText().toString().trim() : "";
            if (!name.isEmpty()) {
                names.add(name);
            }
        }
        return names;
    }
    
    /**
     * Retourne le nombre total de lignes
     * @return Le nombre de lignes
     */
    public int getRowCount() {
        return playerRowList.size();
    }
}
