content: package com.androidgames.tictactoe.ui;
  
  import android.os.Bundle;
  
  import com.androidgames.tictactoe.app.Constantes;
  import com.androidgames.tictactoe.model.Jugada;
  import com.google.android.gms.tasks.OnSuccessListener;
  import com.google.android.material.floatingactionbutton.FloatingActionButton;
  import com.google.android.material.snackbar.Snackbar;
  import androidx.appcompat.app.AppCompatActivity;
  import androidx.appcompat.widget.Toolbar;
  import android.view.View;
  import android.widget.ImageView;
  import android.widget.TextView;
  import android.widget.Toast;
  
  import com.androidgames.tictactoe.R;
  import com.google.firebase.auth.FirebaseAuth;
  import com.google.firebase.auth.FirebaseUser;
  import com.google.firebase.firestore.DocumentSnapshot;
  import com.google.firebase.firestore.EventListener;
  import com.google.firebase.firestore.FirebaseFirestore;
  import com.google.firebase.firestore.FirebaseFirestoreException;
  import com.google.firebase.firestore.ListenerRegistration;
  
  import java.util.ArrayList;
  import java.util.List;
  
  import javax.annotation.Nullable;
  
  public class GameActivity extends AppCompatActivity {
      List<ImageView> casillas;
      TextView tvPlayer1, tvPlayer2;
      FirebaseAuth firebaseAuth;
      FirebaseFirestore db;
      String uid, jugadaId = "", playerOneName = "", playerTwoName = "";
      Jugada jugada;
      ListenerRegistration listenerJugada = null;
      FirebaseUser firebaseUser;
  
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_game);
          Toolbar toolbar = findViewById(R.id.toolbar);
          setSupportActionBar(toolbar);
  
          FloatingActionButton fab = findViewById(R.id.fab);
          fab.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View view) {
                  Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                          .setAction("Action", null).show();
              }
          });
  
          initViews();
          initGame();
      }
  
      private void initGame() {
          firebaseAuth = FirebaseAuth.getInstance();
          firebaseUser = firebaseAuth.getCurrentUser();
          db = FirebaseFirestore.getInstance();
          uid = firebaseUser.getUid();
  
          Bundle extras = getIntent().getExtras();
          jugadaId = extras.getString(Constantes.EXTRA_JUGADA_ID);
      }
  
      private void initViews() {
          tvPlayer1 = findViewById(R.id.textViewPlayer1);
          tvPlayer2 = findViewById(R.id.textViewPlayer2);
  
          casillas = new ArrayList<>();
          casillas.add((ImageView) findViewById(R.id.imageView0));
          casillas.add((ImageView) findViewById(R.id.imageView1));
          casillas.add((ImageView) findViewById(R.id.imageView2));
          casillas.add((ImageView) findViewById(R.id.imageView3));
          casillas.add((ImageView) findViewById(R.id.imageView4));
          casillas.add((ImageView) findViewById(R.id.imageView5));
          casillas.add((ImageView) findViewById(R.id.imageView6));
          casillas.add((ImageView) findViewById(R.id.imageView7));
          casillas.add((ImageView) findViewById(R.id.imageView8));
      }
  
      @Override
      protected void onStart() {
          super.onStart();
          jugadaListener();
      }
  
      private void jugadaListener() {
          listenerJugada = db.collection("jugadas")
                  .document(jugadaId)
                  .addSnapshotListener(GameActivity.this, new EventListener<DocumentSnapshot>() {
                      @Override
                      public void onEvent(@Nullable DocumentSnapshot snapshot, @Nullable FirebaseFirestoreException e) {
                          if(e != null) {
                              Toast.makeText(GameActivity.this, "Error al obtener los datos de la jugadas", Toast.LENGTH_SHORT).show();
                              return;
                          }
  
                          String source = snapshot != null
                                  && snapshot.getMetadata().hasPendingWrites() ? "Local" : "Server";
  
                          if(snapshot.exists() && source.equals("Server")) {
                              // Parseando DocumentSnapshot > Jugada
                              jugada = snapshot.toObject(Jugada.class);
                              if(playerOneName.isEmpty() || playerTwoName.isEmpty()) {
                                  // obtener los nombres de usuario de la jugada
                                  getPlayerNames();
                              }
                          }
                      }
                  });
      }
  
      private void getPlayerNames() {
          // Obtener el nombre del player 1
          db.collection("users")
                  .document(jugada.getJugadorUnoId())
                  .get()
                  .addOnSuccessListener(GameActivity.this, new OnSuccessListener<DocumentSnapshot>() {
                      @Override
                      public void onSuccess(DocumentSnapshot documentSnapshot) {
                          playerOneName = documentSnapshot.get("name").toString();
                          tvPlayer1.setText(playerOneName);
                      }
                  });
  
          // Obtener el nombre del player 2
          db.collection("users")
                  .document(jugada.getJugadorDosId())
                  .get()
                  .addOnSuccessListener(GameActivity.this, new OnSuccessListener<DocumentSnapshot>() {
                      @Override
                      public void onSuccess(DocumentSnapshot documentSnapshot) {
                          playerTwoName = documentSnapshot.get("name").toString();
                          tvPlayer2.setText(playerTwoName);
                      }
                  });
      }
  
      @Override
      protected void onStop() {
          if(listenerJugada != null) {
              listenerJugada.remove();
          }
          super.onStop();
      }
  
      public void casillaSeleccionada(View view) {
          if(!jugada.getGanadorId().isEmpty()) {
              Toast.makeText(this, "La partida ha terminado", Toast.LENGTH_SHORT).show();
          } else {
              if(jugada.isTurnoJugadorUno() && jugada.getJugadorUnoId().equals(uid)) {
                  // Está jugando el jugador 1
                  actualizarJugada(view.getTag().toString());
              } else if(!jugada.isTurnoJugadorUno() && jugada.getJugadorDosId().equals(uid)) {
                  // Está jugando el jugador 2
                  actualizarJugada(view.getTag().toString());
              } else {
                  Toast.makeText(this, "No es tu turno aún", Toast.LENGTH_SHORT).show();
              }
          }
      }
  
      private void actualizarJugada(String numeroCasilla) {
          int posicionCasilla = Integer.parseInt(numeroCasilla);
  
          if(jugada.getCeldasSeleccionadas().get(posicionCasilla) != 0) {
              Toast.makeText(this, "Seleccione una casilla libre", Toast.LENGTH_SHORT).show();
          } else {
              if(jugada.isTurnoJugadorUno()) {
                  casillas.get(posicionCasilla).setImageResource(R.drawable.ic_player_one);
                  jugada.getCeldasSeleccionadas().set(posicionCasilla, 1);
              } else {
                  casillas.get(posicionCasilla).setImageResource(R.drawable.ic_player_two);
                  jugada.getCeldasSeleccionadas().set(posicionCasilla, 2);
              }
          }
  
  
      }
  }
  