package com.example.test;

import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.text.SpannableString;
import android.text.SpannableStringBuilder;
import android.text.style.ForegroundColorSpan;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

public class SecondActivity extends AppCompatActivity
{
    String text1, text2, text3, text4;
    TextView receiver_msg, display;
    SpannableString game;
    SpannableStringBuilder spannableBuilder = new SpannableStringBuilder(game);
    EditText guess1, guess2, guess3, guess4;
    Player player;
    Button backButton, enter;
    private ArrayList<String> words;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        //ActionBar is still active here so it needs to be disabled.
        if (getSupportActionBar() != null)
        {
            getSupportActionBar().hide();
        }

        EditText guess1, guess2, guess3, guess4;
        guess1 = findViewById(R.id.guess1);
        guess2 = findViewById(R.id.guess2);
        guess3 = findViewById(R.id.guess3);
        guess4 = findViewById(R.id.guess4);
        Button enter = findViewById(R.id.button);
        display = findViewById(R.id.game);

        receiver_msg = findViewById(R.id.instructions);
        Intent intent = getIntent();

        Player temp = (Player) intent.getSerializableExtra("fc");
        if (temp != null) {
            //TextView shows the question.
            receiver_msg.setText("Enter 4 words!");
            createGame();
        }
        else
        {
            receiver_msg.setText("null");
        }

        backButton = findViewById(R.id.backButton);
        backButton.setOnClickListener(v -> finish());

    }

    public void createGame()
    {
        Collections.shuffle(words);
        ArrayList<ArrayList<Character>> randomLetters = new ArrayList<>();
        for (int i = 0; i < 4; i++)
        {
            ArrayList<Character> row = new ArrayList<>();
            for (char c: words.get(i).toCharArray())
            {
                row.add(c);
            }
            randomLetters.add(row);
        }

        ArrayList<Character> oneDimensionRandomLetters = new ArrayList<>();
        for (int i = 0; i < randomLetters.size(); i++)
        {
            for (int j = 0; j < randomLetters.get(i).size(); j++)
            {
                oneDimensionRandomLetters.add(randomLetters.get(i).get(j));
            }
        }
        ArrayList<Character> oneDimensionShuffledLetters = oneDimensionRandomLetters;
        Collections.shuffle(oneDimensionShuffledLetters);
        ArrayList<ArrayList<Character>> shuffledLetters = new ArrayList<>();
        int count = 0;
        for (int i = 0; i < 4; i++)
        {
            ArrayList<Character> r = new ArrayList<>();
            for (int j = 0; j < 4; j++)
            {
                r.add(oneDimensionShuffledLetters.get(count));
                count++;
            }
            shuffledLetters.add(r);
        }

        int lives = 3;
        do
        {
            enter.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                    text1 = guess1.getText().toString();
                    text2 = guess2.getText().toString();
                    text3 = guess3.getText().toString();
                    text4 = guess4.getText().toString();
                }
            });

            String[] guesses = {text1, text2, text3, text4};

            if (text1.length() == 4 && text2.length() == 4 && text3.length() == 4 && text4.length() == 4)
            {
                ArrayList<ArrayList<Character>> guessedLetters = new ArrayList<>();
                for (int i = 0; i < 4; i++)
                {
                    ArrayList<Character> a = new ArrayList<>();
                    for (int j = 0; j < 4; j++)
                    {
                        String temp2 = guesses[i];
                        a.add(temp2.charAt(j));
                    }
                    guessedLetters.add(a);
                }
                checkIfCorrect(randomLetters, guessedLetters);
                if (checkWin(randomLetters, guessedLetters))
                {
                    player.addWins();
                    Toast.makeText(SecondActivity.this, "Congratulations!", Toast.LENGTH_LONG).show();
                    finish();
                }
                else
                {
                    lives--;
                    if (lives == 0)
                    {
                        player.addLosses();
                        Toast.makeText(SecondActivity.this, "Better Luck Next Time!", Toast.LENGTH_LONG).show();
                    }
                }
            }
            else
            {
                Toast.makeText(SecondActivity.this, "Enter 4 four letter words!", Toast.LENGTH_LONG).show();
                int temp = player.getLives();
                player.setLives(temp--);
                if (player.getLives() == 0)
                {
                    player.addLosses();
                    Toast.makeText(SecondActivity.this, "Better Luck Next Time!", Toast.LENGTH_LONG).show();
                }
            }

        }
        while (lives > 0);
    }

    public void checkIfCorrect(ArrayList<ArrayList<Character>> answer, ArrayList<ArrayList<Character>> guess) {
        Map<Character, Integer> allAns = new HashMap();
        for (int i = 0; i < answer.size(); i++)
        {
            String[] gy = {" ", " ", " ", " "};
            Map<Character, Integer> ans = new HashMap<>();
            for (Character value : answer.get(i)) {
                ans.put(value, ans.getOrDefault(value, 0) + 1);
            }

            for (int l = 0; l < 4; l++) {
                int value = ans.get(answer.get(i).get(l));
                if (guess.get(i).get(l).equals(answer.get(i).get(l))) {
                    if (value > 0) {
                        gy[l] = "g";
                        ans.replace(answer.get(i).get(l), value - 1);
                    } else {
                        gy[l] = " ";
                    }
                }
            }

            for (int m = 0; m < 4; m++) {
                if (guess.get(i).get(m).equals(answer.get(i).get(0))) {
                    int value2 = ans.get(answer.get(i).get(0));
                    if (value2 > 0 && !gy[m].equals("g"))
                    {
                        gy[m] = "y";
                        ans.replace(answer.get(i).get(0), value2 - 1);
                    }
                } else if (guess.get(i).get(m).equals(answer.get(i).get(1))) {
                    int value3 = ans.get(answer.get(i).get(1));
                    if (value3 > 0 && !gy[m].equals("g"))
                    {
                        gy[m] = "y";
                        ans.replace(answer.get(i).get(1), value3 - 1);
                    }
                } else if (guess.get(i).get(m).equals(answer.get(i).get(2))) {
                    int value4 = ans.get(answer.get(i).get(2));
                    if (value4 > 0 && !gy[m].equals("g"))
                    {
                        gy[m] = "y";
                        ans.replace(answer.get(i).get(2), value4 - 1);
                        allAns.replace(answer.get(i).get(2), value4 - 1);
                    }
                } else if (guess.get(i).get(m).equals(answer.get(i).get(3))) {
                    int value5 = ans.get(answer.get(i).get(3));
                    if (value5 > 0 && !gy[m].equals("g")) {
                        gy[m] = "y";
                        ans.replace(answer.get(i).get(3), value5 - 1);
                    }
                } else {
                    gy[m] = " ";
                }
            }

            for (int o = 0; o < answer.get(i).size(); o++)
            {
                ForegroundColorSpan green = new ForegroundColorSpan(Color.GREEN);
                ForegroundColorSpan yellow = new ForegroundColorSpan(Color.YELLOW);
                String charTemp;
                if (gy[o].equals("g"))
                {
                    game = new SpannableString(guess.get(i).get(0) + " ");
                    game.setSpan(new ForegroundColorSpan(Color.GREEN), 0, game.length(), SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE);
                    spannableBuilder.append(game);
                }
                else if (gy[o].equals("y"))
                {
                    game = new SpannableString(guess.get(i).get(0) + " ");
                    game.setSpan(new ForegroundColorSpan(Color.YELLOW), 0, game.length(), SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE);
                    spannableBuilder.append(game);
                }
                else {
                    game = new SpannableString(guess.get(i).get(0) + " ");
                    spannableBuilder.append(game);
                }
            }
            spannableBuilder.append("\n");
        }
        display.setText(spannableBuilder);
    }

    public static boolean checkWin(ArrayList<ArrayList<Character>> answer, ArrayList<ArrayList<Character>> guess)
    {
        if (answer.equals(guess))
        {
            return true;
        }
        else
        {
            return false;
        }
    }

}
