package e.rick.duolingoclone.ui.tasks.TapPairTask;

import android.content.Context;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.Toast;

import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
import com.nex3z.flowlayout.FlowLayout;
import com.orhanobut.hawk.Hawk;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;

import butterknife.BindView;
import butterknife.ButterKnife;
import e.rick.duolingoclone.Data.Repository;
import e.rick.duolingoclone.Model.PairModel;
import e.rick.duolingoclone.ui.tasks.CustomWord;
import e.rick.duolingoclone.R;
import e.rick.duolingoclone.Utils.ActivityNavigation;
import e.rick.duolingoclone.Utils.Injection;

/**
 * Created by Rick on 3/3/2018.
 */

public class TapPairActivity extends AppCompatActivity{

    private static final String TAG = "TapPairActivity";

    @BindView(R.id.check_button)
    Button checkButton;

    @BindView(R.id.flow_layout)
    FlowLayout flowLayout;

    @BindView(R.id.task_progress_bar)
    ProgressBar progressBar;

    ArrayList<PairModel> pairs;
    ArrayList<CustomWord> compareWords = new ArrayList<>();

    boolean searchingPair = false;

    CustomWord customWord;

    int progressBarValue;
    int pairsFormed;
    int randomN;

    Context context = TapPairActivity.this;

    Random random = new Random();

    Repository repository;

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

        ButterKnife.bind(this);

        initData();
    }

    private void initData() {

        checkButton.setEnabled(false);

        repository = Injection.provideRepository();

        pairs = repository.getPairs();

        Hawk.init(this).build();

        progressBarValue = 0;

        if (Hawk.get("progressBarValue") != null) {

            progressBarValue = Hawk.get("progressBarValue");

            progressBar.setProgress(progressBarValue);
        }

        randomizePair();

        checkButtonListener();
    }

    private void randomizePair() {

        int randomIndex1;
        int randomIndex2;

        //We can use map here as well but it was hard to make it work as I wanted

        Collections.shuffle(pairs);

        randomN = random.nextInt(3) + 4;

        for (int i = 0; i < randomN; i++) {

            PairModel pair = pairs.get(i);

            String pair1 = pair.getPair1();
            String pair2 = pair.getPair2();

            CustomWord customWord1 = new CustomWord(this, pair1);
            CustomWord customWord2 = new CustomWord(this, pair2);

            customWord1.setTag(i);
            customWord2.setTag(i);

            customWord1.setOnTouchListener(new TouchListener());
            customWord2.setOnTouchListener(new TouchListener());

            if (flowLayout.getChildCount() != 0) {

                randomIndex1 = random.nextInt(flowLayout.getChildCount());
                randomIndex2 = random.nextInt(flowLayout.getChildCount());

                flowLayout.addView(customWord1, randomIndex1);
                flowLayout.addView(customWord2, randomIndex2);

            } else {

                flowLayout.addView(customWord1);
                flowLayout.addView(customWord2);
            }
        }
    }

    private class TouchListener implements View.OnTouchListener {

        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {

            customWord = (CustomWord) view;

            if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {

                if (!isSearchingPair()) {

                    compareWords.add(customWord);

                    view.setBackground(getDrawable(R.drawable.custom_word_selected));

                    setSearchingPair(true);

                } else {

                    CustomWord previousWord = compareWords.get(0);

                    if (previousWord != view) {

                        if (previousWord.getTag() == view.getTag()) {

                            Toast.makeText(TapPairActivity.this, "Correct Pair", Toast.LENGTH_SHORT).show();

                            previousWord.setEnabled(false);
                            view.setEnabled(false);

                            previousWord.setBackground(getDrawable(R.drawable.custom_word_border));
                            previousWord.setTextColor(getResources().getColor(R.color.grey_button));

                            view.setBackground(getDrawable(R.drawable.custom_word_border));
                            customWord.setTextColor(getResources().getColor(R.color.grey_button));

                            setSearchingPair(false);

                            compareWords.clear();

                            checkCompleteness();

                        } else {

                            Toast.makeText(TapPairActivity.this, "Wrong Pair", Toast.LENGTH_SHORT).show();

                            previousWord.setBackground(getDrawable(R.drawable.custom_word_border));
                            view.setBackground(getDrawable(R.drawable.custom_word_border));

                            setSearchingPair(false);

                            compareWords.clear();
                        }

                    } else {

                        previousWord.setBackground(getDrawable(R.drawable.custom_word_border));
                        view.setBackground(getDrawable(R.drawable.custom_word_border));

                        setSearchingPair(false);

                        compareWords.clear();
                    }
                }

                return true;
            }

            return false;
        }
    }

    private void checkButtonListener() {

        checkButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                if (progressBarValue < 100) {

                    ActivityNavigation.getInstance(context).takeToRandomTask();

                } else {

                    progressBarValue = 0;

                    Hawk.put("progressBarValue", progressBarValue);
                }
            }
        });
    }

    private void checkCompleteness() {

        pairsFormed ++;

        if (pairsFormed == randomN) {

            Toast.makeText(TapPairActivity.this, "Congratulations, you found all pairs", Toast.LENGTH_SHORT).show();

            progressBarValue += 10;

            progressBar.setProgress(progressBarValue);

            Hawk.put("progressBarValue", progressBarValue);

            checkButton.setEnabled(true);
            checkButton.setText("continue");
            checkButton.setTextColor(getResources().getColor(R.color.button_task_continue));
            checkButton.setBackground(getDrawable(R.drawable.button_task_continue));
        }
    }

    public boolean isSearchingPair() {
        return searchingPair;
    }

    public void setSearchingPair(boolean searchingPair) {
        this.searchingPair = searchingPair;
    }

    @Override
    public void onBackPressed() {

        new MaterialDialog.Builder(this)
                .title("Are you sure about that?")
                .content("All progress in this lesson will be lost.")
                .positiveText("QUIT")
                .onPositive(new MaterialDialog.SingleButtonCallback() {
                    @Override
                    public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {

                        progressBarValue = 0;

                        Hawk.put("progressBarValue", progressBarValue);

                        finish();
                    }
                })
                .negativeText("CANCEL")
                .show();
    }

    @Override
    protected void onStop() {

        progressBarValue = 0;

        Hawk.put("progressBarValue", progressBarValue);

        finish();

        super.onStop();
    }
}