app/src/main/java/com/sqh/market/activity/CartActivity.java
package com.sqh.market.activity;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.lidroid.xutils.ViewUtils;
import com.sqh.market.R;
import com.sqh.market.adapter.ShoppingCartAdapter;
import com.sqh.market.constant.Constants;
import com.sqh.market.models.CartModel;
import com.sqh.market.utils.NetUtil;
import com.sqh.market.utils.SharedPreferencesUtil;

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

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.RequestBody;
import okhttp3.Response;

public class CartActivity extends Activity implements View.OnClickListener,
        ShoppingCartAdapter.CheckInterface, ShoppingCartAdapter.ModifyCountInterface {
    private static final String TAG = "CartActivity";

    /**
     * 返回按钮
     */
    private ImageView btnBack;

    /**
     * 全选框
     */
    private CheckBox ckAll;

    /**
     * 总额
     */
    private TextView tvShowPrice;

    /**
     * 结算
     */
    private TextView tvSettlement;

    /**
     * 编辑按钮
     */
    private TextView btnEdit;

    /**
     * 商品列表
     */
    private ListView commodityListView;

    /**
     * adapter
     */
    private ShoppingCartAdapter shoppingCartAdapter;
    private boolean flag = false;
    private List<CartModel> shoppingCartBeanList = new ArrayList<>();
    private double totalPrice = 0.00;// 购买的商品总价
    private int totalCount = 0;// 购买的商品总数量

    /**
     * context
     */
    private Context mContext;

    /**
     * uId
     */
    private Integer uId;

    /**
     * 用于从网络初始化UI的handler
     */
    private Handler uiHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            //定义一个弹出层dialog
            AlertDialog alert = new AlertDialog.Builder(mContext).create();

            switch (msg.what) {
                case -2:
                    //未登录，需要登录！
                    Toast.makeText(mContext, "您还未登录！请先登录！", Toast.LENGTH_SHORT).show();
                    break;
                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:
                    //网络请求购物车信息数据成功
                    shoppingCartAdapter = new ShoppingCartAdapter(CartActivity.this);
                    shoppingCartAdapter.setCheckInterface(CartActivity.this);
                    shoppingCartAdapter.setModifyCountInterface(CartActivity.this);
                    commodityListView.setAdapter(shoppingCartAdapter);
                    shoppingCartAdapter.setShoppingCartBeanList(shoppingCartBeanList);
                    break;
                case 2:
                    //购买结算
                    alert.setTitle("提示");
                    alert.setMessage(msg.obj == null ? "购买请求处理失败！"
                            : msg.obj.toString());
                    alert.setButton(DialogInterface.BUTTON_POSITIVE, "确定",
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    //finish掉购物车窗口
                                    finish();
                                }
                            });
                    alert.show();
                    break;
                case 3:
                    //删除商品
                    alert.setTitle("提示");
                    alert.setMessage(msg.obj == null ? "从购物车中移除商品失败！"
                            : msg.obj.toString());
                    alert.setButton(DialogInterface.BUTTON_POSITIVE, "确定",
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    dialog.dismiss();
                                }
                            });
                    alert.show();
                    break;
                case 4:
                    Toast.makeText(mContext, msg.obj == null ? "刷新购物车数据失败！"
                            : msg.obj.toString(), Toast.LENGTH_SHORT).show();
                    break;
                default:
                    break;
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_cart);
        ViewUtils.inject(this);
        mContext = this;

        //从SharedPreferences中获取用户id
        uId = (Integer) SharedPreferencesUtil
                .get(mContext, "userInfo", "userId", 0);

        //初始化绑定控件
        init();

        //初始化数据
        initData();
    }

    /**
     * 初始化绑定控件
     */
    private void init() {
        btnBack = findViewById(R.id.cart_back);
        ckAll = findViewById(R.id.ck_all);
        tvShowPrice = findViewById(R.id.tv_show_price);
        tvSettlement = findViewById(R.id.tv_settlement);
        btnEdit = findViewById(R.id.btn_edit);
        commodityListView = findViewById(R.id.list_shopping_cart);

        btnEdit.setText("编辑");
        btnEdit.setOnClickListener(this);
        ckAll.setOnClickListener(this);
        tvSettlement.setOnClickListener(this);
        btnBack.setOnClickListener(this);
    }

    /**
     * 从网络获取购物车数据
     */
    protected void initData() {
        //拼接url
        String url = Constants.BASE_URL + Constants.GET_QUERY_CART_URL + "&uId=" + uId;
        NetUtil.doGet(url, new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                uiHandler.sendEmptyMessage(-1);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                String result = response.body().string();//.trim();
                JSONObject object = JSON.parseObject(result);
                Message message = Message.obtain();
                if (object.getBoolean("flag")) {
                    message.what = 1;

                    //解析拿到data中的lists数据
                    JSONArray lists = ((JSONObject) object.get("data")).getJSONArray("lists");

                    //将list传递给数据集
                    shoppingCartBeanList = JSONArray.parseArray(JSON.toJSONString(lists), CartModel.class);
                } else {
                    message.what = 0;
                }

                uiHandler.sendMessage(message);
            }
        });


    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            //全选按钮
            case R.id.ck_all:
                if (shoppingCartBeanList.size() != 0) {
                    if (ckAll.isChecked()) {
                        for (int i = 0; i < shoppingCartBeanList.size(); i++) {
                            shoppingCartBeanList.get(i).setChoosed(true);
                        }
                        shoppingCartAdapter.notifyDataSetChanged();
                    } else {
                        for (int i = 0; i < shoppingCartBeanList.size(); i++) {
                            shoppingCartBeanList.get(i).setChoosed(false);
                        }
                        shoppingCartAdapter.notifyDataSetChanged();
                    }
                }
                statistics();
                break;
            case R.id.btn_edit:
                flag = !flag;
                if (flag) {
                    //编辑状态
                    btnEdit.setText("完成");
                    shoppingCartAdapter.isShow(false);
                } else {
                    //编辑完成状态
                    btnEdit.setText("编辑");
                    shoppingCartAdapter.isShow(true);
                    //刷新购物车数据
                    refreshCart();
                }
                break;
            case R.id.tv_settlement: //结算
                pay();
                break;
            case R.id.cart_back:
                finish();
                break;
        }
    }

    /**
     * 在编辑完成后，刷新购物车
     */
    private void refreshCart() {
        String cIds = "";
        String numbers = "";

        //选中的需要提交的商品清单
        for (CartModel bean : shoppingCartBeanList) {
            //拼接商品id
            cIds += bean.getId() + ",";
            //拼接商品数量
            numbers += bean.getNumber() + ",";
        }

        //清理末尾逗号
        cIds = cIds.substring(0, cIds.lastIndexOf(","));
        numbers = numbers.substring(0, numbers.lastIndexOf(","));

        //构造url
        String url = Constants.BASE_URL + Constants.POST_REFRESH_CART_URL;
        //构造请求体
        RequestBody body = new FormBody.Builder()
                .add("uId", uId + "")
                .add("cIds", cIds)
                .add("numbers", numbers)
                .build();
        //向服务器发送刷新购物车数据请求
        NetUtil.doPost(url, body, new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                uiHandler.sendEmptyMessage(-1);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                String result = response.body().string();//.trim();
                Message message = Message.obtain();
                Object pare= JSON.parse(result);
                JSONObject object = JSON.parseObject(pare.toString());
                if (object.getBoolean("flag")) {
                    message.what = 4;
                    message.obj = object.getString("message");

                    //重新刷新购物车数据
                    initData();
                } else {
                    message.what = 0;
                }
                uiHandler.sendMessage(message);
            }
        });
    }

    /**
     * 结算订单、支付
     */
    private void pay() {
        String cIds = "";
        String numbers = "";

        //选中的需要提交的商品清单
        for (CartModel bean : shoppingCartBeanList) {
            boolean choosed = bean.isChoosed();
            if (choosed) {
                //拼接商品id
                cIds += bean.getId() + ",";
                //拼接商品数量
                numbers += bean.getNumber() + ",";
            }
        }

        //清理末尾逗号
        cIds = cIds.substring(0, cIds.lastIndexOf(","));
        numbers = numbers.substring(0, numbers.lastIndexOf(","));

        //构造url
        String url = Constants.BASE_URL + Constants.POST_BUY_URL;
        //构造请求体
        RequestBody body = new FormBody.Builder()
                .add("uId", uId + "")
                .add("cIds", cIds)
                .add("numbers", numbers)
                .build();
        //向服务器发送购买请求
        NetUtil.doPost(url, body, new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                uiHandler.sendEmptyMessage(-1);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                String result = response.body().string();//.trim();
                Message message = Message.obtain();
                Object pares = JSON.parse(result);
                JSONObject object = JSON.parseObject(pares.toString());
                if (object.getBoolean("flag")) {
                    message.what = 2;
                    message.obj = object.getString("message");
                } else {
                    message.what = 0;
                }
                uiHandler.sendMessage(message);
            }
        });
    }

    /**
     * 单选
     *
     * @param position  组元素位置
     * @param isChecked 组元素选中与否
     */
    @Override
    public void checkGroup(int position, boolean isChecked) {
        shoppingCartBeanList.get(position).setChoosed(isChecked);
        if (isAllCheck()) {
            ckAll.setChecked(true);
        } else {
            ckAll.setChecked(false);
        }
        shoppingCartAdapter.notifyDataSetChanged();
        statistics();
    }

    /**
     * 遍历list集合
     *
     * @return
     */
    private boolean isAllCheck() {

        for (CartModel group : shoppingCartBeanList) {
            if (!group.isChoosed())
                return false;
        }
        return true;
    }

    /**
     * 统计操作
     * 1.先清空全局计数器<br>
     * 2.遍历所有子元素，只要是被选中状态的，就进行相关的计算操作
     * 3.给底部的textView进行数据填充
     */
    public void statistics() {
        totalCount = 0;
        totalPrice = 0.00;
        for (int i = 0; i < shoppingCartBeanList.size(); i++) {
            CartModel model = shoppingCartBeanList.get(i);
            if (model.isChoosed()) {
                totalCount++;
                totalPrice += model.getCommodityPrice() * model.getNumber();
            }
        }

        //保留两位小数
        DecimalFormat df = new DecimalFormat("#.00");
        String str = df.format(totalPrice);
        tvShowPrice.setText("合计:" + str);
        tvSettlement.setText("结算(" + totalCount + ")");
    }

    /**
     * 增加
     *
     * @param position      组元素位置
     * @param showCountView 用于展示变化后数量的View
     * @param isChecked     子元素选中与否
     */
    @Override
    public void doIncrease(int position, View showCountView, boolean isChecked) {
        CartModel model = shoppingCartBeanList.get(position);
        int currentCount = model.getNumber();
        currentCount++;
        model.setNumber(currentCount);
        ((TextView) showCountView).setText(currentCount + "");
        shoppingCartAdapter.notifyDataSetChanged();
        statistics();
    }

    /**
     * 删减
     *
     * @param position      组元素位置
     * @param showCountView 用于展示变化后数量的View
     * @param isChecked     子元素选中与否
     */
    @Override
    public void doDecrease(int position, View showCountView, boolean isChecked) {
        CartModel model = shoppingCartBeanList.get(position);
        int currentCount = model.getNumber();
        if (currentCount == 1) {
            return;
        }
        currentCount--;
        model.setNumber(currentCount);
        ((TextView) showCountView).setText(currentCount + "");
        shoppingCartAdapter.notifyDataSetChanged();
        statistics();
    }

    /**
     * 删除
     *
     * @param position
     */
    @Override
    public void childDelete(int position) {
        //向服务器发送删除请求
        String url = Constants.BASE_URL + Constants.POST_DELETE_URL;

        //构造请求体
        CartModel model = shoppingCartBeanList.get(position);
        int currentCount = model.getNumber();
        RequestBody body = new FormBody.Builder()
                .add("uId", uId + "")
                .add("cIds", model.getId() + "")
                .add("numbers", currentCount + "")
                .build();

        NetUtil.doPost(url, body, new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                uiHandler.sendEmptyMessage(-1);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                String result = response.body().string();//.trim();
                JSONObject object = JSON.parseObject(result);
                Message message = Message.obtain();
                if (object.getBoolean("flag")) {
                    message.what = 3;
                    message.obj = object.getString("message");
                } else {
                    message.what = 0;
                }
                uiHandler.sendMessage(message);
            }
        });


        //listView中remove掉item
        shoppingCartBeanList.remove(position);
        shoppingCartAdapter.notifyDataSetChanged();
        statistics();
    }
}
