package tup.dota2recipe;

import java.io.IOException;

import org.json2.JSONException;

import tup.dota2recipe.adapter.DBAdapter;
import tup.dota2recipe.adapter.HeroImagesAdapter;
import tup.dota2recipe.adapter.ItemsImagesAdapter;
import tup.dota2recipe.entity.FavoriteItem;
import tup.dota2recipe.entity.HeroItem;
import tup.dota2recipe.entity.ItemsItem;
import tup.dota2recipe.util.Utils;
import tup.dota2recipe.view.SimpleGridView;
import android.annotation.SuppressLint;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.NavUtils;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.ImageView;
import android.widget.ListAdapter;
import android.widget.TextView;

import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;

/**
 * 物品详细 Activity
 * 
 * @author tupunco
 */
public class ItemsDetailActivity extends SwipeBackAppCompatFragmentActivity {
    private static final String TAG = "ItemsDetailActivity";
    /**
     * 物品名称 Intent 参数
     */
    public final static String KEY_ITEMS_DETAIL_KEY_NAME = "KEY_ITEMS_DETAIL_KEY_NAME";
    /**
     * 父物品名称(合成卷轴使用) Intent 参数
     */
    public final static String KEY_ITEMS_DETAIL_PARENT_KEY_NAME = "KEY_ITEMS_DETAIL_PARENT_KEY_NAME";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
        super.onCreate(savedInstanceState);

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        Utils.fillFragment(this, ItemsDetailFragment.newInstance(
                this.getIntent().getStringExtra(KEY_ITEMS_DETAIL_KEY_NAME),
                this.getIntent().getStringExtra(KEY_ITEMS_DETAIL_PARENT_KEY_NAME)));
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                NavUtils.navigateUpFromSameTask(this);
                return true;
        }
        return super.onOptionsItemSelected(item);
    }

    /**
     * 物品详细 Fragment
     */
    public static class ItemsDetailFragment extends Fragment implements
            SimpleGridView.OnItemClickListener {
        private DisplayImageOptions mImageLoadOptions;
        private ItemsItem mItemsItem;
        private MenuItem mMenuCheckAddCollection;

        static ItemsDetailFragment newInstance(String items_keyName) {
            return newInstance(items_keyName, null);
        }

        /**
         * 
         * @param items_keyName
         * @param items_parent_keyName
         * @return
         */
        static ItemsDetailFragment newInstance(String items_keyName,
                String items_parent_keyName) {
            final ItemsDetailFragment f = new ItemsDetailFragment();
            final Bundle b = new Bundle();
            b.putString(KEY_ITEMS_DETAIL_KEY_NAME, items_keyName);
            if (!TextUtils.isEmpty(items_parent_keyName)) {
                b.putString(KEY_ITEMS_DETAIL_PARENT_KEY_NAME,
                        items_parent_keyName);
            }
            f.setArguments(b);
            return f;
        }

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

            setHasOptionsMenu(true);
            mImageLoadOptions = Utils.createDisplayImageOptions();

            final Bundle arg = this.getArguments();
            final String items_keyName = arg.getString(KEY_ITEMS_DETAIL_KEY_NAME);
            final String items_parent_keyName =
                    arg.containsKey(KEY_ITEMS_DETAIL_PARENT_KEY_NAME) ?
                            arg.getString(KEY_ITEMS_DETAIL_PARENT_KEY_NAME) : null;

            Log.v(TAG, "arg.items_keyName=" + items_keyName
                    + " arg.items_parent_keyName" + items_parent_keyName);

            if (!TextUtils.isEmpty(items_keyName)) {
                Utils.executeAsyncTask(mLoaderTask, items_keyName,
                        items_parent_keyName);
            }
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            return inflater.inflate(R.layout.fragment_itemsdetail, container,
                    false);
        }

        @Override
        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
            super.onCreateOptionsMenu(menu, inflater);

            inflater.inflate(R.menu.fragment_itemsdetail, menu);
        }

        @Override
        public void onPrepareOptionsMenu(Menu menu) {
            super.onPrepareOptionsMenu(menu);

            // ----加收藏按钮---
            final MenuItem check = menu.findItem(R.id.menu_check_addcollection);
            mMenuCheckAddCollection = check;
            tryFillMenuCheckAddCollection();
        }

        /**
         * fill MenuItem Check AddCollection
         */
        private void tryFillMenuCheckAddCollection() {
            if (mMenuCheckAddCollection == null || mItemsItem == null) {
                return;
            }

            final MenuItem check = mMenuCheckAddCollection;
            check.setChecked(mItemsItem.hasFavorite == 1);
            Utils.configureStarredMenuItem(check, mItemsItem.isrecipe);
            if (mItemsItem.isrecipe) {
                return;
            }

            check.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
                @Override
                public boolean onMenuItemClick(MenuItem item) {
                    final boolean isChecked = !item.isChecked();
                    final ItemsItem items = mItemsItem;
                    item.setChecked(isChecked);

                    Utils.configureStarredMenuItem(item, items.isrecipe);
                    items.hasFavorite = isChecked ? 1 : 0;
                    if (isChecked) {
                        final FavoriteItem c = new FavoriteItem();
                        c.keyName = items.keyName;
                        c.type = FavoriteItem.KEY_TYPE_ITEMS;
                        DBAdapter.getInstance().addFavorite(c);
                    } else {
                        DBAdapter.getInstance().deleteFavorite(items.keyName);
                    }
                    return true;
                }
            });

        }

        /**
         * 绑定物品视图
         * 
         * @param cItem
         */
        @SuppressLint("NewApi")
        private void bindItemsItemView(ItemsItem cItem) {
            if (cItem == null) {
                return;
            }

            mItemsItem = cItem;
            final FragmentActivity cContext = this.getActivity();
            if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.HONEYCOMB) {
                cContext.invalidateOptionsMenu();
            } else {
                tryFillMenuCheckAddCollection();
            }
            cContext.setTitle(cItem.dname_l);
            final View v = this.getView();
            bindItemsItemSimpleView(v, cItem, mImageLoadOptions);

            // 合成卷轴处理
            if (cItem.isrecipe) {
                final View layout_items_desc = v.findViewById(R.id.layout_items_desc);
                layout_items_desc.setVisibility(View.GONE);

                final View layout_items_desc1 = v.findViewById(R.id.layout_items_desc1);
                if (layout_items_desc1 != null) {
                    layout_items_desc1.setVisibility(View.GONE);
                }

                return;
            }

            final TextView desc = Utils.findById(v, R.id.text_items_desc);
            final TextView lore = Utils.findById(v, R.id.text_items_lore);
            final TextView notes = Utils.findById(v, R.id.text_items_notes);
            final TextView attrib = Utils.findById(v, R.id.text_items_attrib);

            Utils.bindHtmlTextView(desc, cItem.desc);
            Utils.bindHtmlTextView(lore, cItem.lore);
            Utils.bindHtmlTextView(notes, cItem.notes);
            Utils.bindHtmlTextView(attrib, cItem.attrib);

            // mc
            if (!TextUtils.isEmpty(cItem.mc)) {
                ((TextView) v.findViewById(R.id.text_items_mana))
                        .setText(cItem.mc);
            } else {
                v.findViewById(R.id.rlayout_items_mana)
                        .setVisibility(View.GONE);
            }
            // cd
            if (cItem.cd > 0) {
                ((TextView) v.findViewById(R.id.text_items_cd)).setText(String
                        .valueOf(cItem.cd));
            } else {
                v.findViewById(R.id.rlayout_items_cd).setVisibility(View.GONE);
            }
            // components
            if (cItem.components != null && cItem.components.length > 0) {
                final ItemsImagesAdapter adapter = new ItemsImagesAdapter(
                        cContext, mImageLoadOptions, cItem.components_i);

                final SimpleGridView grid = (SimpleGridView) v
                        .findViewById(R.id.grid_items_components);
                grid.setAdapter(adapter);
                grid.setOnItemClickListener(this);
            } else {
                v.findViewById(R.id.llayout_items_components)
                        .setVisibility(View.GONE);
            }
            // tocomponents
            if (cItem.tocomponents != null && cItem.tocomponents.length > 0) {
                final ItemsImagesAdapter adapter = new ItemsImagesAdapter(
                        cContext, mImageLoadOptions, cItem.tocomponents_i);

                final SimpleGridView grid = (SimpleGridView) v
                        .findViewById(R.id.grid_items_tocomponents);
                grid.setAdapter(adapter);
                grid.setOnItemClickListener(this);
            } else {
                v.findViewById(R.id.llayout_items_tocomponents)
                        .setVisibility(View.GONE);
            }
            // toheros
            if (cItem.toheros != null && cItem.toheros.length > 0) {
                final HeroImagesAdapter adapter = new HeroImagesAdapter(
                        cContext, mImageLoadOptions, cItem.toheros_i);
                final SimpleGridView grid = (SimpleGridView) v
                        .findViewById(R.id.grid_items_toheros);
                grid.setAdapter(adapter);
                grid.setOnItemClickListener(this);
            } else {
                v.findViewById(R.id.llayout_items_toheros).setVisibility(View.GONE);
            }
        }

        /**
         * 绑定视图-物品简单数据信息
         * 
         * @param v
         * @param cItem
         * @param cImageLoadOptions
         */
        public static void bindItemsItemSimpleView(final View v, final ItemsItem cItem,
                final DisplayImageOptions cImageLoadOptions) {
            if (v == null || cItem == null || cImageLoadOptions == null) {
                return;
            }

            ImageLoader.getInstance().displayImage(
                    Utils.getItemsImageUri(cItem.keyName),
                    ((ImageView) v.findViewById(R.id.image_items)),
                    cImageLoadOptions);

            ((TextView) v.findViewById(R.id.text_items_dname)).setText(cItem.dname);
            ((TextView) v.findViewById(R.id.text_items_dname_l)).setText(cItem.dname_l);
            ((TextView) v.findViewById(R.id.text_items_cost)).setText(String.valueOf(cItem.cost));
        }

        /**
         * 物品详细 LoaderTask
         */
        private final AsyncTask<String, Void, ItemsItem> mLoaderTask = new AsyncTask<String, Void, ItemsItem>() {
            @Override
            protected void onPreExecute() {
                ItemsDetailFragment.this.getActivity()
                        .setProgressBarIndeterminateVisibility(true);

                super.onPreExecute();
            }

            @Override
            protected void onCancelled() {
                super.onCancelled();

                ItemsDetailFragment.this.getActivity()
                        .setProgressBarIndeterminateVisibility(false);
            }

            @Override
            protected ItemsItem doInBackground(String... params) {
                try {
                    String keyName = params[0];
                    final boolean isrecipe = keyName
                            .equals(DataManager.KEY_NAME_RECIPE_ITEMS_KEYNAME);
                    if (isrecipe) {
                        keyName = params[1];
                    }
                    final ItemsItem cItem = DataManager.getItemsItem(
                            ItemsDetailFragment.this.getActivity(),
                            keyName);
                    if (!isrecipe && cItem != null && cItem.hasFavorite < 0) {
                        final boolean has = DBAdapter.getInstance()
                                .hasFavorite(keyName);
                        cItem.hasFavorite = has ? 1 : 0;
                    }
                    // 合成卷轴数据合并
                    if (isrecipe) {
                        final ItemsItem recipeItem = cItem.components_i
                                .get(cItem.components_i.size() - 1);
                        final ItemsItem resRecipeItem = new ItemsItem();
                        resRecipeItem.cost = recipeItem.cost;
                        resRecipeItem.dname = cItem.dname + " "
                                + recipeItem.dname;
                        resRecipeItem.dname_l = cItem.dname_l
                                + recipeItem.dname_l;
                        resRecipeItem.isrecipe = true;
                        resRecipeItem.keyName = recipeItem.keyName;
                        resRecipeItem.parent_keyName = recipeItem.parent_keyName;
                        return resRecipeItem;
                    }
                    return cItem;
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                return null;
            }

            @Override
            protected void onPostExecute(ItemsItem result) {
                super.onPostExecute(result);

                ItemsDetailFragment.this.bindItemsItemView(result);
                ItemsDetailFragment.this.getActivity()
                        .setProgressBarIndeterminateVisibility(false);
            }
        };

        @Override
        public void onItemClick(ListAdapter parent, View view, int position, long id) {
            if (parent instanceof ItemsImagesAdapter) {
                Utils.startItemsDetailActivity(this.getActivity(),
                        (ItemsItem) parent.getItem(position));
            } else if (parent instanceof HeroImagesAdapter) {
                Utils.startHeroDetailActivity(this.getActivity(),
                        (HeroItem) parent.getItem(position));
            }
        };
    }
}