package com.gracecode.android.gojuon.ui.fragment;

import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.TextView;
import butterknife.ButterKnife;
import butterknife.InjectView;
import com.gracecode.android.gojuon.Characters;
import com.gracecode.android.gojuon.R;
import com.gracecode.android.gojuon.adapter.CharactersAdapter;
import com.gracecode.android.gojuon.common.Gojuon;
import com.gracecode.android.gojuon.ui.dialog.StrokeDialog;

import java.util.Arrays;

public class CharactersFragment extends Fragment {
    private static final int DEFAULT_COLUMN_NUM = 5;
    private static final String STAT_COLUMNS = "stat_colums";
    private static final String STAT_CHARACTERS = "stat_characters";
    private static final String STROKE_DIALOG_TAG = "stroke_dialog_tag";

    private String[][] mCharacters;
    private SharedPreferences mSharedPreferences;
    private int mColumns = DEFAULT_COLUMN_NUM;

    @InjectView(R.id.character_list)
    GridView mGridView;

    @InjectView(R.id.shadow)
    TextView mShadowView;

    private CharactersAdapter mCharactersAdapter;
    private StrokeDialog mStrokeDialog;

    AdapterView.OnItemClickListener mOnItemClickListener = new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            try {
                String katakana = mCharactersAdapter.getItem(i)[Characters.INDEX_KATAKANA];

                // Pronounce the character
                Gojuon.pronounce(getActivity(), katakana);

                // Mark as selected.
                if (mSharedPreferences.getBoolean(Gojuon.KEY_HIGHLIGHT_SELECTED, true) && !katakana.isEmpty()) {
                    view.setSelected(true);
                }
            } catch (RuntimeException e) {
                e.printStackTrace();
            }
        }
    };

    AdapterView.OnItemLongClickListener mOnItemLongClickListener = new AdapterView.OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
            mStrokeDialog.setCharacter(mCharacters[i]);
            mStrokeDialog.show(getFragmentManager(), STROKE_DIALOG_TAG);
            return false;
        }
    };

    public CharactersFragment() {
        super();
    }

    public void setCharactersAndColumns(String[][] characters, int columns) {
        setCharacters(characters);
        setColumns(columns);
    }

    public void setCharacters(String[][] mCharacters) {
        this.mCharacters = mCharacters;
    }

    public String[][] getCharacters() {
        return mCharacters;
    }

    public void setColumns(int mColumns) {
        this.mColumns = mColumns;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (savedInstanceState != null) {
            mColumns = savedInstanceState.getInt(STAT_COLUMNS, DEFAULT_COLUMN_NUM);
            mCharacters = (String[][]) savedInstanceState.getSerializable(STAT_CHARACTERS);
        }

        mSharedPreferences = Gojuon.getInstance().getSharedPreferences();
        mStrokeDialog = new StrokeDialog();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_characters, null);
        ButterKnife.inject(this, view);
        mGridView.setNumColumns(mColumns);
        mGridView.setSoundEffectsEnabled(false);
        mGridView.setChoiceMode(GridView.CHOICE_MODE_SINGLE);
        return view;
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt(STAT_COLUMNS, mColumns);
        outState.putSerializable(STAT_CHARACTERS, mCharacters);
    }

    public String getPreferenceShowType() {
        return mSharedPreferences.getString(Gojuon.KEY_SHOW_CHARACTER_TYPE, CharactersAdapter.TYPE_SHOW_CHARACTER_HIRAGANA);
    }

    public CharactersAdapter getCharactersAdapter() {
        return mCharactersAdapter;
    }

    @Override
    public void onResume() {
        super.onResume();
        if (mCharacters != null && mCharacters.length > 0) {
            mCharactersAdapter = new CharactersAdapter(getActivity(), Arrays.asList(mCharacters));

            // 根据配置项设置显示类型
            mCharactersAdapter.setShowType(getPreferenceShowType());
            mCharactersAdapter.setShadowView(mShadowView);

            mGridView.setAdapter(mCharactersAdapter);
            mGridView.setOnItemClickListener(mOnItemClickListener);

            // 如果是平假名,则长按可以显示笔画对话框
            if (getCharacters() == Characters.MONOGRAPHS) {
                mGridView.setOnItemLongClickListener(mOnItemLongClickListener);
            }
        }
    }
}