package com.unis.sxzcl.ui.house;

import android.content.Context;
import android.view.View;

import com.unis.model.DataCallback;
import com.unis.model.HouseModel;
import com.unis.model.UserModel;
import com.unis.model.bean.HouseListBean;
import com.unis.model.bean.user.UserBean;
import com.unis.sxzcl.widget.BottomMultipleListDialog;
import com.unis.sxzcl.widget.MultipleBean;
import com.xyxsbj.mylibrary.tool.ToastTool;

import java.util.ArrayList;
import java.util.List;

/**
 * 包名: com.unis.sxzcl.ui.house
 * 类名: SelectHouseDialog
 * 作用描述:
 * 创建人: mQ
 * 创建时间: 2020/12/29 16:35
 * 更新人:
 * 更新时间: 2020/12/29 16:35
 * 更新说明:
 * 版本号: 1.0
 */
public class SelectHouseDialog {

    private Context mContext;

    private BottomMultipleListDialog mListDialog;

    // 选项列表
    private List<MultipleBean> mMultipleList = new ArrayList<>();
    // 仓房列表
    private List<HouseListBean> mHouseList = new ArrayList<>();
    // 事件监听
    private Callback mCallback;
    /**
     * true = 只展示登录人管理的仓房
     * false = 无限制(展示所有仓房)
     */
    private boolean mOnlyManageEnable = true;

    /**
     * 构造函数 传入Context
     */
    public SelectHouseDialog(Context context) {
        mContext = context;
        init();
    }

    /********************** 处理逻辑 **************************/

    /**
     * 初始化
     */
    private void init() {
        // 创建对话框
        if (mListDialog == null) {
            mListDialog = new BottomMultipleListDialog(mContext)
                    .hideTwoList()      // 隐藏第二列
                    .hideThreeList()    // 隐藏第三列
                    .hideRightEnter()   // 隐藏确认按钮
                    .setTitle("选择仓房")// 设置标题
            ;
        }
    }

    /**
     * 显示对话框
     *
     * @param depotId
     * @param defSelIndex
     */
    private void showDialog(String depotId, int defSelIndex) {
        // 清理历史列表
        mMultipleList.clear();
        mHouseList.clear();
        // 设置默认选项 和 回调监听
        mListDialog.setListOne(mMultipleList)
                .setSelectOne(defSelIndex)
                .setOneCallback(mOneCallback)
                .show();
        // 获取仓房数据
        getHouseList(depotId);
    }

    /**
     * 仓房选项点击事件监听
     */
    private BottomMultipleListDialog.OneCallback mOneCallback = new BottomMultipleListDialog.OneCallback() {
        @Override
        public boolean onOneClickListener(View v, MultipleBean b1) {
            // 选中项索引
            int oneSelect = mListDialog.getOneSelect();

            // 索引不正常时 回调给监听者null
            if (oneSelect < 0 && mCallback != null) {
                mCallback.onSelectHouseListener(null);
            }

            // 得到已选中的仓房
            HouseListBean bean = mHouseList.get(oneSelect);
            // 保存到本地
            HouseModel.get().setSelectHouse(mHouseList.get(oneSelect));
            // 将仓房回调给监听者
            if (mCallback != null) mCallback.onSelectHouseListener(bean);

            return true;
        }
    };

    /**
     * 根据库ID获取仓房数据
     * 如果登录人获取本库仓房 则只加载管理的仓房
     * 如果登录人获取其它库仓房 则加载所有仓房
     *
     * @param depotId 库ID
     */
    private void getHouseList(String depotId) {
        // 库id异常时 提示信息
        if (depotId == null) {
            ToastTool.showLong("请先选择粮库");
            return;
        }
        // 获取仓房数据
        HouseModel.get().getHouseList(depotId, new DataCallback<List<HouseListBean>>() {
            @Override
            public void onSuccess(List<HouseListBean> data) {

                if (mOnlyManageEnable) {
                    // 1.如果登录人获取本库仓房 则只加载管理的仓房
                    // 2.如果登录人获取其它库仓房 则加载所有仓房
                    // 获取登录人
                    UserBean user = UserModel.get().getUser();
                    if (user == null) return;

                    if (depotId.equals(user.getDepotId())) {
                        // 本库 只加载管理的仓房
                        // 获取管理的仓房id
                        String storehouseIds = user.getStorehouseIds();
                        if (storehouseIds == null) return;
                        String[] houseIds = storehouseIds.split(",");
                        // 与仓房列表进行匹配
                        for (String id : houseIds) {
                            for (HouseListBean bean : data) {
                                if (id.equals(bean.houseCode)) {
                                    // 将id匹配的仓房加入列表中
                                    mHouseList.add(bean);
                                    mMultipleList.add(new MultipleBean(bean.houseName));
                                    break;
                                }
                            }
                        }
                    } else {
                        // 其它库
                        // 所有仓房
                        mHouseList.addAll(data);
                        for (HouseListBean bean : data) {
                            mMultipleList.add(new MultipleBean(bean.houseName));
                        }
                    }
                } else {
                    // 所有仓房
                    mHouseList.addAll(data);
                    for (HouseListBean bean : data) {
                        mMultipleList.add(new MultipleBean(bean.houseName));
                    }
                }
                // 显示到列表上
                mListDialog.setListOne(mMultipleList);
            }
        });
    }

    /********************** 对外提供的方法 **************************/

    /**
     * 显示仓房选择弹出框
     * <p>
     * 选择的仓房保存到本地,并回调给使用者
     * 为防止多业务调用,每次show()都重新获取数据并刷新列表
     *
     * @param depotId
     * @param defSelIndex
     */
    public void show(String depotId, int defSelIndex) {
        showDialog(depotId, defSelIndex);
    }

    /**
     * 是否只取登录人所管理的仓房
     */
    public void setOnlyManageEnable(boolean onlyManageEnable) {
        mOnlyManageEnable = onlyManageEnable;
    }

    /**
     * 设置选中仓房的监听事件
     *
     * @param callback
     */
    public void setCallback(Callback callback) {
        mCallback = callback;
    }

    public interface Callback {
        void onSelectHouseListener(HouseListBean bean);
    }


}
