package com.unis.sxzcl.ui.allround;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.fragment.app.FragmentTransaction;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.unis.model.BasicModel;
import com.unis.model.DataCallback;
import com.unis.model.DepotModel;
import com.unis.model.HouseModel;
import com.unis.model.ProcessModel;
import com.unis.model.UserModel;
import com.unis.model.bean.HouseListBean;
import com.unis.model.bean.aeration.AerationBean;
import com.unis.model.bean.detail.DetailApproveBean;
import com.unis.model.bean.detail.DetailItemBean;
import com.unis.model.bean.detail.DetailItemType;
import com.unis.model.bean.process.ProcessDetailBean;
import com.unis.model.bean.process.ProcessItemBean;
import com.unis.model.bean.process.ProcessListBean;
import com.unis.sxzcl.R;
import com.unis.sxzcl.base.BaseFragment;
import com.unis.sxzcl.databinding.FragmentAllroundBinding;
import com.xyxsbj.mylibrary.tool.LogTool;
import com.xyxsbj.mylibrary.tool.StringTool;
import com.xyxsbj.mylibrary.tool.ToastTool;

import org.greenrobot.eventbus.EventBus;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 全面流程Fragment
 * (有需要可复制后自行修改)
 * 创建人: mQ
 * 创建时间: 2021/1/26 14:28
 */
public class AllRoundFragment extends BaseFragment<FragmentAllroundBinding> implements ProcessDetailFragment.SaveCallback {

    /****************** 传参使用的Key **********************/
    // 页面类型
    public static final String key_page_type = "pageType";
    // 业务类型
    public static final String key_work_type = "workType";
    // 业务数据
    public static final String key_info = "info";


    // 页面类型
    private String mPageType = "add";
    // 业务类型
    private String mWorkType;
    // 业务数据
    private AerationBean mBean;

    // 节点适配器
    private ProcessAdapter mProcessAdapter;
    // 流程数据
    private List<ProcessListBean> mWorkList;

    // 审批人数据
    private List<DetailApproveBean> mApproveList;

    // 自增序号
    private int optionCount;
    // 页面集合
    private List<ProcessDetailFragment> mFragments = new ArrayList<>();

    // 当前显示的页面位置
    private int oldIndex = 0;

    @Override
    protected FragmentAllroundBinding getViewBinding(LayoutInflater inflater, ViewGroup container) {
        return FragmentAllroundBinding.inflate(inflater, container, false);
    }

    @Override
    protected void init() {
        // 设置标题
        mBinding.bar.setLeftClickListener(v -> onBack());
        mBinding.bar.setRightText("待办事项").setRightClickListener(v -> {
            Bundle bundle = new Bundle();
            bundle.putInt("tabIndex", 1);
            navigation(R.id.todoHomeFragment, bundle);
        });

        // 接收参数
        Bundle bundle = getArguments();
        if (bundle == null) {
            ToastTool.showLong("没有参数");
            onBack();
            return;
        }

        // 页面类型
        mPageType = bundle.getString(key_page_type, "add");

        // 业务类型
        mWorkType = bundle.getString(key_work_type);

        // 设置标题名称
        mBinding.bar.setTitle(BasicModel.get().getWorkTypeName(mWorkType));

        String info = bundle.getString(key_info);
        mBean = getGson().fromJson(info, AerationBean.class);

        LogTool.i("类型:" + mPageType);

        initProcess();
    }

    /**
     * 初始化流程节点列表
     */
    private void initProcess() {
        // 创建节点列表适配器
        mProcessAdapter = new ProcessAdapter();
        // 监听节点切换事件
        mProcessAdapter.setSwitchCallback(item -> {
            LogTool.i("隐藏:" + oldIndex + "  显示:" + mProcessAdapter.getCurrentIndex());
            // 切换节点 隐藏历史页面 显示对应页面
            getChildFragmentManager().beginTransaction()
                    .hide(mFragments.get(oldIndex))
                    .show(mFragments.get(mProcessAdapter.getCurrentIndex()))
                    .commit();
            oldIndex = mProcessAdapter.getCurrentIndex();
        });

        // 设置节点列表适配器
        mBinding.recyclerViewProcess.setAdapter(mProcessAdapter);
        LinearLayoutManager manager = new LinearLayoutManager(getContext());
        // 列表横向
        manager.setOrientation(RecyclerView.HORIZONTAL);
        mBinding.recyclerViewProcess.setLayoutManager(manager);
        mProcessAdapter.setEmptyView(getLoadingView());
    }

    @Override
    protected void onFirstShow() {
        // 首次加载
        getData();
    }

    private void getData() {
        if (mPageType.equals("add")) {
            // 新增时获取初始化信息
            // 1.获取审批人
            // 2.获取业务数据
            // 3.创建流程节点
            // 4.创建业务页面
            getApproveData();
        } else {
            // 获取详情信息
            getDetail();
        }
    }

    /**
     * 获取审批人数据
     */
    private void getApproveData() {
        // 获取审批人
        ProcessModel.get().getApproveAll(mWorkType, new DataCallback<List<DetailApproveBean>>() {
            @Override
            public void onSuccess(List<DetailApproveBean> data) {
                if (!isActive()) return;
                mApproveList = data;

                // 获取业务数据
                getWorkData();
            }

            @Override
            public void onError(String error) {
                super.onError(error);
                if (!isActive()) return;
                // 获取业务数据
                getWorkData();
            }
        });
    }

    /**
     * 获取业务数据
     */

    private void getWorkData() {
        // 获取业务数据
        ProcessModel.get().getProcessAll(mWorkType, new DataCallback<List<ProcessListBean>>() {
            @Override
            public void onSuccess(List<ProcessListBean> data) {
                if (!isActive()) return;
                mProcessAdapter.setEmptyView(getEmptyView(emptyClick));
                // 业务数据
                mWorkList = data;

                initPage();// 创建页面
                setProcessData();// 添加节点数据
            }

            @Override
            public void onError(String error) {
                super.onError(error);
                if (!isActive()) return;
                mProcessAdapter.setEmptyView(getErrorView(emptyClick));
            }
        });
    }

    /**
     * 获取回显数据
     */
    public void getDetail() {
        ProcessModel.get().getDetail(mBean.getProcessId(), new DataCallback<ProcessDetailBean>() {
            @Override
            public void onSuccess(ProcessDetailBean data) {
                if (!isActive()) return;
                mProcessAdapter.setEmptyView(getEmptyView(emptyClick));
                // 审批数据
                mApproveList = data.audit;

                // 业务数据
                mWorkList = data.process;

                initPage();// 创建页面
                setProcessData();// 添加节点数据
            }

            @Override
            public void onError(String error) {
                super.onError(error);
                if (!isActive()) return;
                mProcessAdapter.setEmptyView(getErrorView(emptyClick));
            }
        });
    }

    // 无数据 和 加载失败的点击事件
    View.OnClickListener emptyClick = v -> {
        // 等待动画 获取数据
        mProcessAdapter.setEmptyView(getLoadingView());
        getData();
    };

    /**
     * 初始化详情页面
     */
    private void initPage() {
        if (mWorkList == null || mWorkList.isEmpty()) return;

        FragmentTransaction bt = getChildFragmentManager().beginTransaction();

        for (int i = 0; i < mWorkList.size(); i++) {
            ProcessListBean bean = mWorkList.get(i);
            // 创建选项数据
            List<DetailItemBean> optionList = null;
            if (bean.list != null && !bean.list.isEmpty()) {
                optionList = new ArrayList<>();
                for (ProcessItemBean item : bean.list) {
                    optionCount++;// 定义序号自增
                    // 单选
                    DetailItemBean itemBean = new DetailItemBean(DetailItemType.radio)
                            .setTitle(item.title)           // 标题
                            .setId(item.id + "")            // id
                            .setIndex(optionCount)          // 序号
                            .setFlowId(item.zid + "")       // 流程id
                            .setSelectIndex(item.subData)   // 选中项
                            .setTime(item.operationTime)    // 操作时间
                            .setOption(item.details.split(","))// 选项
                            .setAuditId(item.auditId);      // 主键id

                    optionList.add(itemBean);
                }
            }
            // 流程中有审批 且有 审批数据
            boolean approve = bean.step == null || (bean.step.getExistProcess().equals("0") && mApproveList != null);

            // TODO: 2021/3/2  判断:如果当前流程是审批流程 则 之前页面都不可修改  (mPageType)

            // 创建页面
            ProcessDetailFragment fragment;
            fragment = ProcessDetailFragment.newFragment(
                    i,                              // 页面位置
                    i == mWorkList.size() - 1,      //是否最后一页
                    mPageType,                      // 页面类型
                    BasicModel.get().getWorkTypeName(mWorkType),// 业务名称
                    optionList,                     // 选项数据
                    approve ? mApproveList : null); // 审批数据
            // 设置页面的按钮监听
            fragment.setSaveCallback(this);
            mFragments.add(fragment);

            // 将页面加入到容器中
            bt.add(R.id.container_layout, fragment);

            // 控制显示与隐藏
            if (mPageType.equals("detail")) {
                // 详情 显示已执行的流程
                if (i <= getOngoingStep()) {
                    LogTool.i("显示页面:" + i);
                    bt.show(fragment);
                } else {
                    LogTool.i("隐藏页面:" + i);
                    bt.hide(fragment);
                }
            } else {
                bt.hide(fragment);
            }
        }

        if (mPageType.equals("add")) {
            // 新增 只显示第一个页面
            bt.show(mFragments.get(0));
            LogTool.i("显示第一个页面");
        } else if (mPageType.equals("edit")) {
            // 修改 只显示执行中的页面
            int ongoingStep = getOngoingStep();
            oldIndex = ongoingStep;
            bt.show(mFragments.get(ongoingStep));
            LogTool.i("显示执行中的页面:" + oldIndex);
        }
        // 提交事务
        bt.commit();
    }

    /**
     * 添加节点数据
     */
    private void setProcessData() {
        // 没有业务数据  或 没有节点数据 隐藏节点列表
        if (mWorkList == null || mWorkList.isEmpty() || mWorkList.get(0).step == null) {
            mBinding.recyclerViewProcess.setVisibility(View.GONE);
            return;
        }

        // 添加节点数据
        for (ProcessListBean bean : mWorkList) {
            mProcessAdapter.addData(bean.step);
        }
        // 设置节点状态
        if (mPageType.equals("add")) {
            // 新增时 只能操纵第一个节点
            mProcessAdapter.setMaxClickIndex(0);
            mProcessAdapter.setCurrentIndex(0);

        } else if (mPageType.equals("edit")) {
            // 修改
            // 取出业务的当前节点为最大可选节点
            int ongoingStep = getOngoingStep();
            mProcessAdapter.setCurrentIndex(ongoingStep);
            mProcessAdapter.setMaxClickIndex(ongoingStep);
        } else {
            // 详情
            // 节点全选
            mProcessAdapter.setCurrentIndex(getOngoingStep());
            // 不可切换
            mProcessAdapter.setSwitchEnable(false);
        }
    }

    /**
     * 获取执行中的节点位置
     */
    private int getOngoingStep() {
        if (mBean == null || mBean.getOngoingStep() == null)
            return 0;
        return Integer.parseInt(mBean.getOngoingStep());
    }

    /**
     * 保存按钮回调监听
     *
     * @param pageIndex  页面位置
     * @param optionList 选项数据集合
     */
    @Override
    public void onSaveCallback(int pageIndex, List<DetailItemBean> optionList) {
        LogTool.i("保存按钮事件---页面位置:" + pageIndex);
        LogTool.i("保存按钮事件---选项数据:" + getGson().toJson(optionList));

        // 所选库
        String depotId = DepotModel.get().getSelectDepot().depotCode;
        // 所选仓
        HouseListBean selectHouse = HouseModel.get().getSelectHouse();
        String houseId = selectHouse != null ? selectHouse.houseCode : null;
        // 登录人id
        String uid = UserModel.get().getUser().getUid().toString();

        // 取出选项值
        List<Map<String, Object>> subList = new ArrayList<>();
        for (DetailItemBean bean : optionList) {
            // 只取单选 和 已选
            if (bean.getItemType() != DetailItemType.radio)
                continue;
            if (bean.getSelectIndex() == null)
                continue;
            Map<String, Object> map = new HashMap<>();
            // 选项id
            map.put("subId", Integer.parseInt(bean.getId()));
            // 选中项
            map.put("subData", Integer.parseInt(bean.getSelectIndex()));
            // 操作时间
            map.put("operationTime", bean.getTime());
            // 节点id
            map.put("mainId", StringTool.notEmpty(bean.getFlowId()) ? Integer.parseInt(bean.getFlowId()) : null);
            map.put("auditId", bean.getAuditId());
            subList.add(map);
        }

        showProgress("正在提交...", false);
        if (mPageType.equals("add")) {
            // 新增
            ProcessModel.get()
                    .add(subList, mWorkType, houseId, depotId, uid, uid, "0",
                            mDataCallback);
        } else {
            // TODO: 2021/3/2 判断:如果当前流程是审批流程 则 流程位置不变,业务状态修改为0(提交)

            // 修改
            ProcessDetailFragment currentPage = mFragments.get(pageIndex);


            // 非最后一页选项全选并提交时, 页面位置+1（也就是应当处理下个页面）
            String ongoingStep = mBean.getOngoingStep();//页面位置
            if (currentPage.isSelectFinish() && !currentPage.mIsEnd)
                ongoingStep = String.valueOf(pageIndex + 1);

            // 最后一页选项全选并提交时, 业务状态改为4(已完成)
            String auditState = mBean.getAuditState();
            if (currentPage.isSelectFinish() && currentPage.mIsEnd) {
                auditState = "4";
            }

            ProcessModel.get()
                    .update(subList, auditState, mWorkType, mBean.getProcessId(), String.valueOf(ongoingStep),
                            mDataCallback);
        }
    }


    DataCallback mDataCallback = new DataCallback<String>() {
        @Override
        public void onSuccess(String data) {
            if (!isActive()) return;
            hideProgress();
            // 通知列表刷新
            EventBus.getDefault().post(new ProcessEvent(mWorkType));
            ToastTool.showLong("保存成功");
            onBack();
        }

        @Override
        public void onError(String error) {
            super.onError(error);
            if (!isActive()) return;
            hideProgress();
        }
    };
}
