package com.unis.sxzcl.ui.drug_custody;

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

import androidx.fragment.app.FragmentTransaction;

import com.unis.model.BasicModel;
import com.unis.model.DataCallback;
import com.unis.model.DepotModel;
import com.unis.model.ProcessModel;
import com.unis.model.bean.aeration.AerationBean;
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.unis.sxzcl.ui.allround.ProcessDetailFragment;
import com.unis.sxzcl.ui.allround.ProcessEvent;
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;

/**
 * 药剂保管详情
 * 创建人: mQ
 * 创建时间: 2021/1/26 14:28
 */
public class DrugCustodyDetailFragment 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 List<ProcessListBean> mWorkList;

    // 自增序号
    private int optionCount;

    // 页面集合
    private List<ProcessDetailFragment> mFragments = new ArrayList<>();

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

    @Override
    protected void init() {
        // 接收参数
        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))
                .setLeftClickListener(v -> onBack());

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

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

    }

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

    private void getData() {
        if (mPageType.equals("add")) {
            getWorkData();
        } else {
            // 获取详情信息
            getDetail();
        }
    }

    /**
     * 获取业务数据
     */
    private void getWorkData() {
        showProgress("正在加载...");
        // 获取业务数据
        ProcessModel.get().getProcessAll(mWorkType, new DataCallback<List<ProcessListBean>>() {
            @Override
            public void onSuccess(List<ProcessListBean> data) {
                if (!isActive()) return;
                hideProgress();
                // 业务数据
                mWorkList = data;

                initPage();// 创建页面
            }

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

    /**
     * 获取回显数据
     */
    public void getDetail() {
        showProgress("正在加载...");
        ProcessModel.get().getDetail(mBean.getProcessId(), new DataCallback<ProcessDetailBean>() {
            @Override
            public void onSuccess(ProcessDetailBean data) {
                if (!isActive()) return;
                hideProgress();
                // 业务数据
                mWorkList = data.process;

                initPage();// 创建页面
            }

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

    // 无数据 和 加载失败的点击事件
    View.OnClickListener emptyClick = v -> {
        // 等待动画 获取数据
        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);
                }
            }

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

            // 将页面加入到容器中
            bt.add(R.id.container_layout, fragment);
        }
        // 提交事务
        bt.commit();
    }

    /**
     * 获取执行中的节点位置
     */
    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));

        ProcessDetailFragment fragment = mFragments.get(pageIndex);
        boolean selectFinish = fragment.isSelectFinish();

        // 所选库
        String depotId = DepotModel.get().getSelectDepot().depotCode;

        // 取出选项值
        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().drugCustodyAddOrUpdate(mWorkType, depotId, null, selectFinish ? 4 : 3, subList, mDataCallback);
        } else {
            // 修改
            ProcessModel.get().drugCustodyAddOrUpdate(mWorkType, depotId, mBean.getProcessId(), selectFinish ? 4 : 3, subList, 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();
        }
    };
}
