package com.sqh.market.fragments;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.support.v4.widget.SwipeRefreshLayout;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.SearchView;
import android.widget.Toast;

import com.alibaba.fastjson.JSON;
import com.sqh.market.R;
import com.sqh.market.activity.DetailsActivity;
import com.sqh.market.activity.SearchViewActivity;
import com.sqh.market.adapter.GlideImageLoader;
import com.sqh.market.adapter.HomePageGridViewAdapter;
import com.sqh.market.adapter.HomePageViewPagerAdapter;
import com.sqh.market.adapter.HotGridViewAdapter;
import com.sqh.market.adapter.RecommendGridViewAdapter;
import com.sqh.market.constant.Constants;
import com.sqh.market.models.CommodityModel;
import com.sqh.market.models.CommodityTypeModel;
import com.sqh.market.utils.ListUtil;
import com.sqh.market.utils.NetUtil;
import com.youth.banner.Banner;
import com.youth.banner.BannerConfig;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;

/**
 * 首页
 *
 * @author 郑龙
 */

public class HomePage extends Fragment {
    /**
     * 轮播
     */
    private Banner banner;

    /**
     * GridView小圆点指示器
     */
    private ViewGroup points;

    /**
     * 小圆点指示器图片集合
     */
    private ImageView[] ivPoints;

    /**
     * viewPager
     */
    private ViewPager viewPager;

    /**
     * 总的页数
     */
    private int totalPage = 0;

    /**
     * 每页显示的最大数量
     */
    private int mPageSize = 10;

    /**
     * 商品数据源
     */
    private List<CommodityTypeModel> listData = new ArrayList<>();

    /**
     * GridView作为一个View对象添加到ViewPager集合中
     */
    private List<View> viewPagerList;

    /**
     * 热评产品
     */
    private GridView hotProductGridView;

    /**
     * 推荐产品
     */
    private GridView recommendProductGridView;

    /**
     * 热评和推荐商品的两个进度条
     */
    private ProgressBar hotProgressBar, recommendProgressBar;

    private HotGridViewAdapter hotProductGridViewAdapter;
    private RecommendGridViewAdapter recommendProductGridViewAdapter;

    private SearchView searchView;
    private ArrayList<String> imageList = new ArrayList<>();

    /**
     * 一次请求到分页商品数据
     */
    private List<CommodityModel> listItem = new ArrayList<>();

    /**
     * 热评商品List
     */
    private List<CommodityModel> listItemHot = new ArrayList<>();

    /**
     * 推荐商品List
     */
    private List<CommodityModel> listItemRecommend = new ArrayList<>();

    /**
     * 下拉刷新的layout
     */
    private SwipeRefreshLayout mRefreshLayout;
    /**
     * 为了刷新不增加小点增加的记录的变量
     */
    private int firstFlag = 0;

    /**
     * 定义一个自己的context
     */
    private Context mContext;

    /**
     * 用于从网络初始化UI的handler
     */
    private Handler uiHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case -1:
                    //网络请求失败
                    Toast.makeText(mContext, "网络请求失败!获取商品类别失败!", Toast.LENGTH_SHORT).show();
                    break;
                case 0:
                    //网络请求成功,但是返回状态为失败
                    Toast.makeText(mContext, msg.obj == null ? "获取商品数据失败!" : msg.obj.toString(), Toast.LENGTH_SHORT).show();
                    break;
                case 1:
                    //网络请求商品类别返回成功时,初始化控件
                    initViewPage();
                    break;
                case 2:
                    //随机两款商品作为热销商品
                    listItemHot = ListUtil.getRandomList(listItem, 2);
                    //模拟获取热评商品
                    hotProductGridViewAdapter = new HotGridViewAdapter(HomePage.this.getContext(), listItemHot);
                    hotProductGridView.setAdapter(hotProductGridViewAdapter);
                    //设置gridview点击事件
                    hotProductGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                        @Override
                        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                            Intent intent = new Intent(getActivity(), DetailsActivity.class);
                            //将对应的产品id传到详情界面
                            intent.putExtra("id", listItemHot.get(position).getId() + "");
                            startActivity(intent);
                        }
                    });

                    //停止显示热评商品加载动画,显示商品信息
                    hotProgressBar.setVisibility(View.GONE);
                    hotProductGridView.setVisibility(View.VISIBLE);

                    //随机两款商品作为热销商品
                    listItemRecommend = ListUtil.getRandomList(listItem, 2);
                    //模拟获取推荐商品
                    recommendProductGridViewAdapter = new RecommendGridViewAdapter(HomePage.this.getContext(), listItemRecommend);
                    recommendProductGridView.setAdapter(recommendProductGridViewAdapter);
                    //设置gridView点击事件
                    recommendProductGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                        @Override
                        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                            Intent intent = new Intent(getActivity(), DetailsActivity.class);
                            //将对应的产品id传到详情界面
                            intent.putExtra("id", listItemRecommend.get(position).getId() + "");
                            startActivity(intent);
                        }
                    });

                    //停止显示热评商品加载动画,显示商品信息
                    recommendProgressBar.setVisibility(View.GONE);
                    recommendProductGridView.setVisibility(View.VISIBLE);
                    break;
                default:
                    break;
            }

            //判断刷新动画
            if (mRefreshLayout.isRefreshing()) {
                //停止动画
                mRefreshLayout.setRefreshing(false);
            }
        }
    };

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_homepage, null);
        //        初始化控件
        initView(view);

        //转存context
        mContext = getActivity().getApplicationContext();

        //判断网络状态,并初始化数据
        if (NetUtil.isNetworkAvailable(getContext())) {
            //获取分类
            initCategoryClassification();
            //加载轮播图
            initBanner();
            //获取热评商品
            initCommodityList(Constants.HOME_PAGE_LIMIT, 0, true);
        } else {
            // TODO: 2019/3/21 这里会弹出一个框,提示网络不正常!
            Toast.makeText(getActivity().getApplicationContext()
                    , "当前网络环境不正常,商品 信息可能无法显示"
                    , Toast.LENGTH_LONG).show();
        }

        //设置searchView点击事件
        setSearchViewIntent();

        // 刷新监听。
        mRefreshLayout.setOnRefreshListener(mRefreshListener);
        return view;
    }

    /**
     * 初始化广告页
     */
    private void initBanner() {
        //清空旧数据
        imageList.clear();
        imageList.add(Constants.BASE_ADS_URL + Constants.ADS.ADS_URL1.getUrl());
        imageList.add(Constants.BASE_ADS_URL + Constants.ADS.ADS_URL2.getUrl());
        banner.setImages(imageList);
        banner.start();
    }

    /**
     * 刷新
     */
    private SwipeRefreshLayout.OnRefreshListener mRefreshListener = new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            //获取分类
            initCategoryClassification();
            //加载轮播图
            initBanner();
            //获取商品分页数据
            initCommodityList(Constants.HOME_PAGE_LIMIT, 0, true);
        }
    };

    /**
     * 获取商品分页数据
     *
     * @param limit        拉取数据条数(首页建议为6)
     * @param page         页码
     * @param isRandomPage 是否采用随机页码
     */
    private void initCommodityList(int limit, int page, boolean isRandomPage) {
        //初始化随机页码
        int randomPage = (int) (Math.random() * (Constants.MAX - Constants.MIN)) + Constants.MIN;

        //构造请求URL
        String url = Constants.BASE_URL + Constants.GET_COMMODITY_URL
                + "?limit=" + limit;

        //判断是否需要随机生成页码
        if (isRandomPage) {
            url += "&page=" + randomPage;
        } else {
            url += "&page=" + page;
        }

        NetUtil.doGet(url, new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {
                        Log.e("TAG", "错误信息:" + e.toString());
                        Message message = Message.obtain();
                        message.what = -1;
                        uiHandler.sendMessage(message);
                    }

                    @Override
                    public void onResponse(Call call, Response response) throws IOException {
                        String result = response.body().string().trim();
                        com.alibaba.fastjson.JSONObject object = JSON.parseObject(result);

                        Message message = Message.obtain();

                        if (object.getBoolean("flag")) {
                            com.alibaba.fastjson.JSONObject data = (com.alibaba.fastjson.JSONObject) object.get("data");
                            com.alibaba.fastjson.JSONArray array = data.getJSONArray("lists");
                            //获得商品list
                            listItem = com.alibaba.fastjson
                                    .JSONArray.parseArray(array.toString(), CommodityModel.class);
                            message.what = 2;
                        } else {
                            message.what = 0;
                        }

                        uiHandler.sendMessage(message);
                    }
                }
        );
    }

    /**
     * 初始化GridView
     */
    private void initViewPage() {
        LayoutInflater inflater2 = LayoutInflater.from(this.getContext());
        //总的页数,取整(这里有三种类型:Math.ceil(3.5)=4:向上取整,只要有小数都+1  Math.floor(3.5)=3:向下取整  Math.round(3.5)=4:四舍五入)
        //这个被tjs改过
        //if(totalPage>0){
        totalPage = (int) Math.ceil(listData.size() * 1.0 / mPageSize);
        //}

        viewPagerList = new ArrayList<>();
        for (int i = 0; i < totalPage; i++) {
            //每个页面都是inflate出一个新实例
            GridView gridView = (GridView) inflater2.inflate(R.layout.gridview_layout, viewPager, false);
            gridView.setAdapter(new HomePageGridViewAdapter(this.getContext(), listData, i, mPageSize));
            //每一个GridView作为一个View对象添加到ViewPager集合中
            viewPagerList.add(gridView);
        }
        //设置ViewPager适配器
        viewPager.setAdapter(new HomePageViewPagerAdapter(viewPagerList));
        //小圆点指示器
        if (firstFlag == 0) {
            ivPoints = new ImageView[totalPage];
            for (int i = 0; i < ivPoints.length; i++) {
                ImageView imageView = new ImageView(getContext());
                //设置图片的宽高
                imageView.setLayoutParams(new ViewGroup.LayoutParams(10, 10));
                if (i == 0) {
                    imageView.setBackgroundResource(R.drawable.page__selected_indicator);
                } else {
                    imageView.setBackgroundResource(R.drawable.page__normal_indicator);
                }
                ivPoints[i] = imageView;
                LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
                        ViewGroup.LayoutParams.WRAP_CONTENT));
                layoutParams.leftMargin = 10;//设置点点点view的左边距
                layoutParams.rightMargin = 10;//设置点点点view的右边距
                points.addView(imageView, layoutParams);
            }
        }
        if (totalPage > 0) {
            firstFlag++;
        }


        //设置ViewPager滑动监听
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                //改变小圆圈指示器的切换效果
                setImageBackground(position);
//                currentPage = position;
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
    }

    /**
     * 初始化获取商品分类
     */
    private void initCategoryClassification() {
        String categoryTypeUrl = Constants.BASE_URL + Constants.GET_COMMODITY_TYPES_URL;
        NetUtil.doGet(categoryTypeUrl, new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.e("网络请求失败!", "网络请求失败!获取商品类别列表失败!");
                Message message = Message.obtain();
                message.what = -1;
                uiHandler.sendMessage(message);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                String result = response.body().string().trim();
                com.alibaba.fastjson.JSONObject obj = JSON.parseObject(result);

                Message message = Message.obtain();
                if (obj.getBoolean("flag")) {
                    message.what = 1;
                    //获得商品类型数据
                    List<CommodityTypeModel> types = com.alibaba.fastjson.JSONArray
                            .parseArray(JSON.toJSONString(obj.get("data"))
                                    , CommodityTypeModel.class);
                    listData = types;
                } else {
                    message.what = 0;
                }

                message.obj = obj.getString("message");
                uiHandler.sendMessage(message);
            }
        });
    }


    /**
     * 初始化绑定控件
     *
     * @param view view
     */
    public void initView(View view) {

        mRefreshLayout = view.findViewById(R.id.refresh_layout);
        viewPager = view.findViewById(R.id.viewPager);
        //初始化小圆点指示器
        points = view.findViewById(R.id.points);

        //绑定两个进度条
        hotProgressBar = view.findViewById(R.id.hot_progress);
        recommendProgressBar = view.findViewById(R.id.recommend_progress);


        banner = view.findViewById(R.id.banner);
        //设置banner样式
        banner.setBannerStyle(BannerConfig.CIRCLE_INDICATOR);
        //设置图片加载器
        banner.setImageLoader(new GlideImageLoader());


        hotProductGridView = view.findViewById(R.id.hot_gridview);
        recommendProductGridView = view.findViewById(R.id.recommend_gridview);
        searchView = view.findViewById(R.id.home_serachview);

    }

    /**
     * searchView点击跳转
     */
    private void setSearchViewIntent() {
        searchView.setFocusable(false);
        searchView.clearFocus();

        //设置搜索框焦点
        searchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (hasFocus)
                    searchView.clearFocus();
                else {
                    Intent intent = new Intent(getActivity(), SearchViewActivity.class);
                    intent.putExtra("fatherName", ".HomePage");
                    startActivityForResult(intent, 1);
                }
            }
        });
    }

    /**
     * 设置GridView图片背景
     *
     * @param selectItems 选中项index
     */
    private void setImageBackground(int selectItems) {
        for (int i = 0; i < ivPoints.length; i++) {
            if (i == selectItems) {
                ivPoints[i].setBackgroundResource(R.drawable.page__selected_indicator);
            } else {
                ivPoints[i].setBackgroundResource(R.drawable.page__normal_indicator);
            }
        }
    }
}