package systems.intelligo.memorize.words;

import android.app.Fragment;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import com.mancj.materialsearchbar.MaterialSearchBar;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import systems.intelligo.memorize.AppMain;
import systems.intelligo.memorize.Injection;
import systems.intelligo.memorize.R;
import systems.intelligo.memorize.database.entity.Words;
import systems.intelligo.memorize.detail.DetailActivity;

import static com.google.common.base.Preconditions.checkNotNull;

public class WordsFragment extends Fragment implements WordsContract.View {

    private MaterialSearchBar searchBar;

    private WordsContract.Presenter presenter;
    private WordsAdapter mAdapter;
    private RecyclerView mRecyclerView;
    private RecyclerView.LayoutManager mLayoutManager;
    private List<String> suggestList = new ArrayList<>();

    private TextView filterText;

    public WordsFragment() {
    }

    public static android.app.Fragment newInstance() {
        WordsFragment fragment = new WordsFragment();
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mAdapter = new WordsAdapter(new ArrayList<Words>(0), R.layout.item_word_list);

        new WordsPresenter(Injection.provideWordsRepository(AppMain.getContext()), this);

        presenter.init();
    }

    @Override
    public void onResume() {
        super.onResume();
        presenter.init();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View root = inflater.inflate(R.layout.fragment_words, container, false);

        filterText = root.findViewById(R.id.filter_title);
        searchBar = root.findViewById(R.id.searchBar);
        SwipeRefreshLayout swipeRefreshLayout = root.findViewById(R.id.swipe_layout);
        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                presenter.loadWords(false);
            }
        });

        searchBar.setMaxSuggestionCount(2);
        searchBar.setSpeechMode(true);
        searchBar.setHint("Хайх үгээ оруул..");

        searchBar.addTextChangeListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                Log.d("LOG_TAG", getClass().getSimpleName() + " text changed " + searchBar.getText());
                // send the entered text to our filter and let it manage everything
                List<String> suggest = new ArrayList<>();
                for (String search : suggestList) {
                    if (search.toLowerCase().contains(searchBar.getText().toLowerCase()))
                        suggest.add(search);
                }
                searchBar.setLastSuggestions(suggest);
            }

            @Override
            public void afterTextChanged(Editable editable) {

            }

        });

        searchBar.setOnSearchActionListener(new MaterialSearchBar.OnSearchActionListener() {
            @Override
            public void onSearchStateChanged(boolean enabled) {
//                if (!enabled)

            }

            @Override
            public void onSearchConfirmed(CharSequence text) {
                presenter.search(text.toString());
            }

            @Override
            public void onButtonClicked(int buttonCode) {
                switch (buttonCode) {
                    case MaterialSearchBar.BUTTON_NAVIGATION:

                        break;
                    case MaterialSearchBar.BUTTON_SPEECH:

                        break;

                    case MaterialSearchBar.BUTTON_BACK:
                        searchBar.disableSearch();

                }
            }
        });

        mRecyclerView = root.findViewById(R.id.word_recycler_view);
        mRecyclerView.setHasFixedSize(true);
        mLayoutManager = new LinearLayoutManager(AppMain.getContext());
        mRecyclerView.setItemAnimator(new DefaultItemAnimator());
        mRecyclerView.setLayoutManager(mLayoutManager);
        mRecyclerView.setAdapter(mAdapter);

        Spinner sortSpinner = root.findViewById(R.id.sort);
        Spinner viewSpinner = root.findViewById(R.id.view);

        List<String> sorts = new LinkedList<>(Arrays.asList("Recently", "Active", "All", "Translate"));

        List<String> views = new LinkedList<>(Arrays.asList("List", "Grid", "Card"));

        ArrayAdapter<String> sortAdapter = new ArrayAdapter<String>(AppMain.getContext(),
                R.layout.spinner_item, sorts);
        sortAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        ArrayAdapter<String> viewAdapter = new ArrayAdapter<String>(AppMain.getContext(),
                R.layout.spinner_item, views);
        viewAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        sortSpinner.setAdapter(sortAdapter);
        viewSpinner.setAdapter(viewAdapter);

        sortSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

                com.orhanobut.logger.Logger.e("Selected position :" + position);
                switch (position) {
                    case 0:
                        presenter.setFilterType(WordFilterType.RECENTLY);
                        break;
                    case 1:
                        presenter.setFilterType(WordFilterType.ACTIVE_WORDS);
                        break;
                    case 2:
                        presenter.setFilterType(WordFilterType.ALL_WORDS);
                        break;
                    case 3:
                        presenter.setFilterType(WordFilterType.NOT_TRANSLATE);
                        break;
                    default:
                        presenter.setFilterType(WordFilterType.RECENTLY);
                        break;
                }
                presenter.loadWords(false);
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });

        viewSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                switch (position) {
                    case 0:
                        mAdapter = new WordsAdapter(new ArrayList<Words>(0), R.layout.item_word_list);
                        mLayoutManager = new LinearLayoutManager(AppMain.getContext());
                        mRecyclerView.setLayoutManager(mLayoutManager);
                        mRecyclerView.setAdapter(mAdapter);
                        break;
                    case 1:
                        mAdapter = new WordsAdapter(new ArrayList<Words>(0), R.layout.item_word_grid);
                        mLayoutManager = new GridLayoutManager(AppMain.getContext(), 2);
                        mRecyclerView.setLayoutManager(mLayoutManager);
                        mRecyclerView.setAdapter(mAdapter);
                        break;
                    case 2:
                        presenter.setViewType(WordViewType.CARD);
                        break;
                    default:
                        presenter.setViewType(WordViewType.LIST);
                        break;
                }
                presenter.loadWords(false);
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });

        return root;
    }

    @Override
    public void setPresenter(WordsContract.Presenter presenter) {
        this.presenter = checkNotNull(presenter);
    }

    @Override
    public void showToast(String message) {
        Toast.makeText(AppMain.getContext(), message, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void setLoadingIndicator(final boolean active) {
        if (getView() == null) {
            return;
        }
        final SwipeRefreshLayout refreshLayout = getView().findViewById(R.id.swipe_layout);

        // Make sure setRefreshing() is called after the layout is done with everything else.
        refreshLayout.post(new Runnable() {
            @Override
            public void run() {
                refreshLayout.setRefreshing(active);
            }
        });
    }

    @Override
    public void showWords(List<Words> words) {
        mAdapter.replaceData(words);
    }

    @Override
    public void showWordDetail(Words word) {
        Intent intent = new Intent(AppMain.getContext(), DetailActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.putExtra("word_detail", word);
        suggestList.add(word.getCharacter());
        AppMain.getContext().startActivity(intent);
    }

    @Override
    public void showLoadingWordsError() {

    }

    @Override
    public void showNoWords() {

    }

    @Override
    public boolean isActive() {
        return false;
    }


    private class WordsAdapter extends RecyclerView.Adapter<WordsAdapter.ViewHolder> {
        private List<Words> words;
        private final int resource;

        public WordsAdapter(List<Words> words, int resource) {
            this.words = words;
            this.resource = resource;
        }

        public void replaceData(List<Words> words) {
            setList(words);
            notifyDataSetChanged();
        }

        private void setList(List<Words> words) {
            this.words = checkNotNull(words);
        }

        public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

            private TextView kanjiText;
            private TextView characterText;

            private ViewHolder(View v) {
                super(v);
                v.setOnClickListener(this);
                kanjiText = v.findViewById(R.id.kanji_text);
                characterText = v.findViewById(R.id.character_text);
            }

            @Override
            public void onClick(View view) {
                presenter.openWordDetails(words.get(this.getAdapterPosition()));
            }
        }

        @Override
        public WordsAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
                                                          int viewType) {
            View v = LayoutInflater.from(parent.getContext())
                    .inflate(resource, parent, false);
            WordsAdapter.ViewHolder vh = new WordsAdapter.ViewHolder(v);
            return vh;
        }

        @Override
        public void onBindViewHolder(final WordsAdapter.ViewHolder holder, final int position) {
            holder.kanjiText.setText(words.get(position).getKanji());
            holder.characterText.setText(words.get(position).getCharacter());
            if (words.get(position).getIsLocal()) {
                holder.kanjiText.setTextColor(getResources().getColor(R.color.chartGreen));
                holder.characterText.setTextColor(getResources().getColor(R.color.chartGreen));
            }
        }

        @Override
        public int getItemCount() {
            return words.size();
        }
    }
}