package cc.bitky.bitkyshop.fragment.userfragment.orderactivity;

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import cc.bitky.bitkyshop.R;
import cc.bitky.bitkyshop.bean.Commodity;
import cc.bitky.bitkyshop.bean.cart.CommodityOrder;
import cc.bitky.bitkyshop.bean.cart.Order;
import cc.bitky.bitkyshop.bean.cart.ReceiveAddress;
import cc.bitky.bitkyshop.fragment.userfragment.addressactivity.AddressOptionActivity;
import cc.bitky.bitkyshop.utils.KyToolBar;
import cc.bitky.bitkyshop.utils.ToastUtil;
import cc.bitky.bitkyshop.utils.recyclerview.DividerItemDecoration;
import cc.bitky.bitkyshop.utils.recyclerview.KyBaseRecyclerAdapter;
import cc.bitky.bitkyshop.utils.recyclerview.KyBaseViewHolder;
import cc.bitky.bitkyshop.utils.tools.KySet;
import cn.bmob.v3.BmobQuery;
import cn.bmob.v3.exception.BmobException;
import cn.bmob.v3.listener.FindListener;
import cn.bmob.v3.listener.QueryListener;
import cn.bmob.v3.listener.SaveListener;
import com.socks.library.KLog;
import java.util.ArrayList;
import java.util.List;

public class OrderActivity extends AppCompatActivity implements View.OnClickListener {
  private Context mContext;
  private ReceiveAddress receiveAddress;

  private Order order;
  private List<Commodity> commodities;

  private TextView name;
  private TextView phone;
  private TextView address;

  private View addressLayout;
  private RecyclerView recyclerView;
  private KyBaseRecyclerAdapter recyclerAdapter;
  private TextView tvPriceTotal;

  private Button btnOrderGeneration;
  private ToastUtil toastUtil;
  private Button btnCompleted;
  private Button btncancel;
  private View historyOrderInfoLayout;
  private View bottomNavigation;
  private OrderActivityPresenter presenter;
  private TextView orderStatus;
  private List<CommodityOrder> commodityOrderSubmitList;

  private int currentStatus;

  @Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_order);
    mContext = this;
    presenter = new OrderActivityPresenter(this);
    toastUtil = new ToastUtil(mContext);

    historyOrderInfoLayout = findViewById(R.id.orderActivity_relativeLayout_historyOrderInfo);
    TextView orderId = (TextView) findViewById(R.id.orderActivity_historyOrderInfo_OrderId);
    TextView orderCreatedTime =
        (TextView) findViewById(R.id.orderActivity_historyOrderInfo_OrderCreatedTime);
    orderStatus = (TextView) findViewById(R.id.orderActivity_historyOrderInfo_orderStatus);

    addressLayout = findViewById(R.id.orderActivity_addressCardView);
    ImageView imageViewArrowRight =
        (ImageView) findViewById(R.id.orderActivity_addressCardView_ArrowRight);
    name = (TextView) findViewById(R.id.orderActivity_userName);
    phone = (TextView) findViewById(R.id.orderActivity_phone);
    address = (TextView) findViewById(R.id.orderActivity_address);

    recyclerView = (RecyclerView) findViewById(R.id.orderActivity_recycler_commodity);

    bottomNavigation = findViewById(R.id.orderActivity_bottomNavigation);
    tvPriceTotal = (TextView) findViewById(R.id.orderActivity_textview_total);
    btnOrderGeneration = (Button) findViewById(R.id.orderActivity_btn_orderGeneration);
    btnCompleted = (Button) findViewById(R.id.orderActivity_confirmCompleted);
    btncancel = (Button) findViewById(R.id.orderActivity_cancelOrder);

    KyToolBar kyToolBar = (KyToolBar) findViewById(R.id.orderActivity_kyToolbar);
    kyToolBar.setNavigationOnClickListener(this);
    btnOrderGeneration.setOnClickListener(this);
    btnCompleted.setOnClickListener(this);
    btncancel.setOnClickListener(this);

    switchOrderLocation(OrderLocation.local);
    initRecyclerView();

    int requestCode = getIntent().getIntExtra("requestCode", -1);
    KLog.d("requestCode" + requestCode);
    currentStatus = requestCode;
    switch (requestCode) {
      case KySet.CART_REQUEST_SUBMIT_ORDER:
        bottomNavigation.setVisibility(View.VISIBLE);
        btnOrderGeneration.setVisibility(View.VISIBLE);
        imageViewArrowRight.setVisibility(View.VISIBLE);
        addressLayout.setVisibility(View.VISIBLE);
        addressLayout.setOnClickListener(this);
        queryDefaultAddressFromBmob();
        break;
      case KySet.USER_REQUEST_HISTORY_ORDER:
        historyOrderInfoLayout.setVisibility(View.VISIBLE);
        bottomNavigation.setVisibility(View.VISIBLE);
        orderId.setText(order.getObjectId());
        orderCreatedTime.setText(order.getCreatedAt());
        changeOrderStatus(order);
        name.setText(order.getName());
        phone.setText(order.getPhone());
        address.setText(order.getAddress());
        break;
      default:
        finish();
        break;
    }
    initRecyclerOrderData(order.getCommodityList());
  }

  /**
   * 根据不同的订单状态改变界面显示
   */
  public void changeOrderStatus(Order order) {
    this.order = order;

    switch (order.getStatus()) {
      case Order.POSTED:
        orderStatus.setText("订单已确认");
        orderStatus.setTextColor(mContext.getResources().getColor(R.color.red));
        btnCompleted.setVisibility(View.VISIBLE);
        btncancel.setVisibility(View.VISIBLE);
        break;
      case Order.CONFIRMED:
        orderStatus.setText("商品已送达");
        orderStatus.setTextColor(mContext.getResources().getColor(R.color.blue));
        btnCompleted.setVisibility(View.VISIBLE);
        btncancel.setVisibility(View.INVISIBLE);
        break;
      case Order.COMPLETED:
        orderStatus.setText("订单已完成");
        orderStatus.setTextColor(mContext.getResources().getColor(R.color.green));
        btnCompleted.setVisibility(View.INVISIBLE);
        btncancel.setVisibility(View.INVISIBLE);
        break;
      case Order.CANCELLED:
        orderStatus.setText("订单已取消");
        orderStatus.setTextColor(mContext.getResources().getColor(R.color.gray));
        btnCompleted.setVisibility(View.INVISIBLE);
        btncancel.setVisibility(View.INVISIBLE);
        break;
    }
  }

  /**
   * 选择 Order 对象所处的位置并获取所需的 Order 对象
   *
   * @param orderLocation Order 对象所处的位置
   */
  private void switchOrderLocation(OrderLocation orderLocation) {
    switch (orderLocation) {
      case local:
        Bundle bundle = getIntent().getBundleExtra("bundle");
        Order order = (Order) bundle.getSerializable("order");
        initOrder(order);
        break;
      case bmob:
        queryCurrentOrderFromBmob();
        break;
    }
  }

  /**
   * 分析获得的Order对象,进行必要的初始化
   *
   * @param order Order对象
   */
  private void initOrder(Order order) {
    String userObjectId = order.getUserObjectId();
    String userName = order.getUsername();

    if (userObjectId != null && userName != null) {
      this.order = order;
    } else {
      Intent intent = new Intent();
      intent.putExtra("message", "请求的JavaBean(Order)内容不完整");
      setResult(KySet.RESULT_ERROR, intent);
      finish();
    }
  }

  private void queryDefaultAddressFromBmob() {
    BmobQuery<ReceiveAddress> bmobQuery = new BmobQuery<>();
    bmobQuery.addWhereEqualTo("userObjectId", order.getUserObjectId());
    bmobQuery.addWhereEqualTo("isDefault", true);
    bmobQuery.setLimit(50);
    bmobQuery.findObjects(new FindListener<ReceiveAddress>() {

      @Override public void done(List<ReceiveAddress> list, BmobException e) {
        if (e != null) {
          toastUtil.show(e.getMessage());
          return;
        }
        if (list.size() > 0) {
          receiveAddress = list.get(0);
          name.setText(receiveAddress.getName());
          phone.setText(receiveAddress.getPhone());
          address.setText(receiveAddress.getAddress());
        }
      }
    });
  }

  /**
   *
   */
  private void queryCurrentOrderFromBmob() {
    BmobQuery<Order> bmobQuery = new BmobQuery<>();
    bmobQuery.addWhereEqualTo("objectId", order.getObjectId());
    bmobQuery.findObjects(new FindListener<Order>() {

      @Override public void done(List<Order> list, BmobException e) {
        if (e != null) {
          toastUtil.show(e.getMessage());
          return;
        }
        if (list.size() > 0) {
          order = list.get(0);
          initOrder(order);
        }
      }
    });
  }

  private void initRecyclerView() {
    if (recyclerAdapter == null) {
      initRecyclerAdapter(new ArrayList<Commodity>());
    }
    recyclerView.setLayoutManager(new LinearLayoutManager(mContext));
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.addItemDecoration(
        new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST));
    recyclerView.setAdapter(recyclerAdapter);
  }

  private void initRecyclerOrderData(List<CommodityOrder> commodityOrders) {
    //用于从服务器请求得到的商品信息
    commodities = new ArrayList<>();
    //用于提交到服务器中的订单中的商品信息
    commodityOrderSubmitList = new ArrayList<>();

    for (final CommodityOrder commodityOrder : commodityOrders) {
      BmobQuery<Commodity> bmobQuery = new BmobQuery<>();
      bmobQuery.getObject(commodityOrder.getObjectId(), new QueryListener<Commodity>() {
        @Override public void done(Commodity commodity, BmobException e) {
          if (e != null) {
            KLog.d("有异常:" + e.getMessage());
            return;
          }
          if (commodity.getCount() <= 0 && currentStatus == KySet.CART_REQUEST_SUBMIT_ORDER) {
            return;
          }
          KLog.d("读取成功,objectId:" + commodity.getObjectId() + "," + commodity.getName());
          commodity.setCount(commodityOrder.getCount());
          commodities.add(commodity);
          commodityOrderSubmitList.add(commodityOrder);
          recyclerAdapter.reloadData(commodities);
          countTotalPrices();
        }
      });
    }
  }

  /**
   * 计算并显示已勾选商品的总价
   */
  public void countTotalPrices() {
    double priceTotal = 0;
    if (commodities != null && commodities.size() > 0) {
      for (Commodity commodityLocal : commodities) {
        int count = commodityLocal.getCount();
        double price = commodityLocal.getPrice();
        priceTotal = priceTotal + price * count;
      }
    }
    tvPriceTotal.setText("合计: " + priceTotal + "元");
  }

  public void initRecyclerAdapter(List<Commodity> list) {
    recyclerAdapter =
        new KyBaseRecyclerAdapter<Commodity>(list, R.layout.recycler_orderactivity_show) {
          @Override
          public void setDataToViewHolder(final Commodity dataItem, KyBaseViewHolder holder) {
            holder.getSimpleDraweeView(R.id.recycler_orderActivity_draweeview)
                .setImageURI(Uri.parse(dataItem.getCoverPhotoUrl()));
            holder.getTextView(R.id.recycler_orderActivity_text_title).setText(dataItem.getName());
            holder.getTextView(R.id.recycler_orderActivity_text_price)
                .setText(dataItem.getPrice().toString() + " 元");
            holder.getTextView(R.id.recycler_orderActivity_text_count)
                .setText("X " + dataItem.getCount());
          }
        };
  }

  @Override public void onClick(View v) {
    switch (v.getId()) {

      //导航栏返回
      case R.id.kytoolbar_navigation:
        finish();
        break;

      //收货地址信息CardView,设置收货地址
      case R.id.orderActivity_addressCardView:
        KLog.d("激活");
        Intent intent = new Intent(mContext, AddressOptionActivity.class);
        intent.putExtra("requestCode", KySet.CART_REQUEST_SELECT_RECEIVE_ADDRESS);
        intent.putExtra("userName", order.getUsername());
        intent.putExtra("objectId", order.getUserObjectId());
        startActivityForResult(intent, KySet.CART_REQUEST_SELECT_RECEIVE_ADDRESS);
        break;

      //生成订单按钮
      case R.id.orderActivity_btn_orderGeneration:
        if (receiveAddress != null) {
          btnOrderGeneration.setEnabled(false);
          if (commodityOrderSubmitList.size() <= 0) {
            toastUtil.show("您选择的商品可能被抢光了, 请重新选择");
            return;
          }
          //生成用于提交服务器的新的Order对象
          Order orderSubmit = new Order(commodityOrderSubmitList);
          orderSubmit.setAddressAndUserInfo(receiveAddress);
          if (orderSubmit.isDone()) {
            KLog.d("已上传服务器:" + orderSubmit.getCommodityList().size());
            orderSubmit.save(new SaveListener<String>() {
              @Override public void done(String objectId, BmobException e) {
                if (e == null) {
                  Intent intentResult = new Intent();
                  Bundle bundle = new Bundle();
                  order.setObjectId(objectId);
                  bundle.putSerializable("order", order);
                  intentResult.putExtra("bundle", bundle);
                  setResult(KySet.CART_RESULT_SUBMIT_ORDER, intentResult);
                  finish();
                } else {
                  btnOrderGeneration.setEnabled(true);
                  toastUtil.show("订单生成失败,请重试");
                }
              }
            });
          }
        } else {
          toastUtil.show("请先点击上方的标签添加收货地址");
        }
        break;
      case R.id.orderActivity_confirmCompleted:
        setResult(KySet.USER_RESULT_REFRESH_ORDER);
        presenter.updateOrderStatus(order, Order.COMPLETED);
        break;
      case R.id.orderActivity_cancelOrder:
        setResult(KySet.USER_RESULT_REFRESH_ORDER);
        presenter.updateOrderStatus(order, Order.CANCELLED);
        break;
    }
  }

  public void showMessage(String message) {
    toastUtil.show(message);
  }

  @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (resultCode) {
      case KySet.CART_RESULT_SELECT_RECEIVE_ADDRESS:
        ReceiveAddress receiveAddress = (ReceiveAddress) data.getSerializableExtra("address");
        if (receiveAddress != null) {
          this.receiveAddress = receiveAddress;
          name.setText(receiveAddress.getName());
          phone.setText(receiveAddress.getPhone());
          address.setText(receiveAddress.getAddress());
        }
        break;
    }
  }

  enum OrderLocation {
    local,
    bmob
  }
}