import {ref, reactive , toRefs, onMounted, watch} from 'vue'
import { onPullDownRefresh, onShow, onReachBottom,onLoad } from '@dcloudio/uni-app'

// requestFun: 请求函数  dataHandle: 数据处理函数  params 额外的固定的请求数据 
export default function (requestFun, dataHandle = data => data, params = {} ,flag=true,onshow=true,pageSize = 10) {
	
	// 该对象会返回给每个页面，用于取值
	const useDataResult = reactive({  
		dataList: [], // 数据列表 
		listTipText: '加载更多' // 列表底部提示文字  1.加载更多 2.加载中 3.暂无更多
	})
	
	const listParams = {} // 页面传参对象 getList方法中传的参数
	
	const queryObj = reactive({	
		pageNumber: 1, // 默认是1 
		pageSize: pageSize, // 默认10条，可传参修改
		isLoad: false, // 是否为上拉加载
		titlePage: '', // 总页数
	})
	
	const getList = (listParamObj) => {
		
		// 非下拉刷新才显示加载提示
		if (queryObj.isLoad) {
			uni.showLoading({ title:'加载中'})
		}
		
		useDataResult.listTipText = '加载中' // 列表底部提示文字  1.加载更多 2.加载中 3.暂无更多
		
		// listParamObj 父组件在函数中携带的请求参数，与页码页数，固定参数，合并到一起，并且当该参数对象在调用时有具体值，会将页码重置为1
		let paramObj // 参数合并
		
		if(listParamObj) {
			queryObj.pageNumber = 1
			Object.keys(listParamObj).forEach(item => {
				listParams[item] = listParamObj[item]
			})
			useDataResult.dataList = []
		}
		
		paramObj = Object.assign({
			pageNumber: queryObj.pageNumber,
			pageSize: queryObj.pageSize
		}, params, listParams)
		
		requestFun(paramObj).then(({ bizData }) => {
			
			uni.hideLoading()
			
			queryObj.titlePage = Math.ceil(bizData.total / queryObj.pageSize) // 页码总数
				
			if (queryObj.titlePage == queryObj.pageNumber || bizData.records.length == 0) {
				useDataResult.listTipText = '暂无更多'
			}

			uni.stopPullDownRefresh() // 请求成功停止下拉刷新
			
			// dataHandle 函数用于对数据的集中处理，在每个页面可自定义
			let data = dataHandle(bizData.records ? bizData.records : bizData)
			
			// 下拉刷新重置数据， 上拉加载新增数据
			if (queryObj.isLoad) {
				useDataResult.dataList.push(...data)
			} else {
				useDataResult.dataList = data
			}
			
		}).catch(err => uni.hideLoading())
	}
	
	// 只在onshow时调用一次， 请求方法
	const onShowGetList = () => {
		if(!flag) return false
		uni.showLoading({ title:'加载中'})
		queryObj.pageNumber = 1 // 页码固定为1
		let paramObj = Object.assign({ // 合并请求参数
			pageNumber: 1,
			pageSize: queryObj.pageSize
		}, params)
		
		requestFun(paramObj).then(({ bizData }) => {
			uni.hideLoading()
			queryObj.titlePage = Math.ceil(bizData.total / queryObj.pageSize)
			
			if (queryObj.titlePage == queryObj.pageNumber || bizData.records.length == 0) {
				useDataResult.listTipText = '暂无更多'
			}
			
			// dataHandle 函数用于对数据的集中处理，在每个页面可自定义
			let data = dataHandle(bizData.records ? bizData.records : bizData)
			
			useDataResult.dataList = data // 由于只在onShow 中调用一次，所以数据重新赋值
			
		}).catch(err => {uni.hideLoading()})
	}
	
	onShow(() => {
		if(onshow){
			onShowGetList()
		}
		
	})
	onLoad(()=>{
		if(!onshow){
			onShowGetList()
		}
	})
	
	// 下拉刷新
	onPullDownRefresh(() => {
		queryObj.pageNumber = 1 
		queryObj.isLoad = false
		getList()
	})
	
	// 上拉加载
	onReachBottom( () => {
		queryObj.pageNumber ++
		if (queryObj.pageNumber > queryObj.titlePage) {
			queryObj.pageNumber  = queryObj.pageNumber
			return queryObj.isLoad = false
		}
		queryObj.isLoad = true
		getList()
	})
	
	return {
		useDataResult, // 返回结果对象
		getList // 请求函数，每个页面自定义请求参数
	}

}