import request from '../utils/request';

/**
 * 打卡营相关 API 接口
 * 整合了打卡营、任务、订单、支付等所有相关接口
 */
export const campApi = {
	// ==================== 打卡营基础信息 ====================
	
	/**
	 * 获取打卡营分类列表
	 */
	getCampCategories: () => {
		const url = `/camp/categories?keyword=&page=1&page_size=10`;
		return request({
			url,
			method: 'GET'
		});
	},

	/**
	 * 获取打卡营列表
	 * @param {String} categoryId - 分类ID，如果为 undefined/null/-1 则返回推荐打卡营
	 * @param {String} userId - 用户ID（可选，如果不传则从本地存储获取）
	 */
	getCamps: (categoryId, userId) => {
		const user_id = String(userId || wx.getStorageSync('wxuserid') || '');
		// 已加入打卡营：只返回当前用户已加入的营
		if (categoryId === 'joined') {
			return request({
				url: `/camp/camps?joined_only=1&page=1&page_size=50&user_id=${encodeURIComponent(user_id)}`,
				method: 'GET'
			});
		}
		// 推荐打卡营（与后端 RecommendFilter 约定：only_true = 只返回推荐的）
		if (!categoryId || categoryId === 'undefined' || categoryId === '-1') {
			return request({
				url: `/camp/camps?recommend_filter=only_true&page=1&page_size=20&user_id=${encodeURIComponent(user_id)}`,
				method: 'GET'
			});
		}
		// 按分类筛选
		const url = `/camp/camps?category_id=${categoryId}&page=1&page_size=20&user_id=${encodeURIComponent(user_id)}`;
		return request({
			url,
			method: 'GET'
		});
	},

	/**
	 * 获取打卡营详情
	 * @param {String} campId - 打卡营ID
	 * @param {String} userId - 用户ID（可选，如果不传则从本地存储获取）
	 */
	getCampDetail: (campId, userId) => {
		const user_id = String(userId || wx.getStorageSync('wxuserid') || '');
		// 根据 proto 定义，使用查询参数 id
		return request({
			url: `/camp/camps/detail?id=${campId}&user_id=${encodeURIComponent(user_id)}`,
			method: 'GET'
		});
	},

	/**
	 * 获取打卡营详情及状态（聚合接口，包含用户状态、小节、任务等完整信息）
	 * @param {String} campId - 打卡营ID
	 * @param {String} userId - 用户ID
	 */
	getCampDetailWithUserStatus: (campId, userId) => {
		return request({
			url: `/camp/camp_detail_with_user_status`,
			method: 'POST',
			data: {
				camp_id: String(campId),
				user_id: String(userId || wx.getStorageSync('wxuserid') || '')
			}
		});
	},

	// ==================== 用户打卡营操作 ====================

	/**
	 * 加入打卡营
	 * @param {String} campId - 打卡营ID
	 */
	joinCamp: (campId) => {
		return request({
			url: `/camp/user_camp/join`,
			method: 'POST',
			data: {
				user_id: String(wx.getStorageSync('wxuserid') || ''), // 从本地存储获取用户ID
				camp_id: campId
			}
		});
	},

	/**
	 * 检查用户是否加入打卡营
	 * @param {String} campId - 打卡营ID
	 */
	checkUserCampStatus: (campId) => {
		return request({
			url: `/camp/check_user_camp_status`,
			method: 'POST',
			data: {
				user_id: String(wx.getStorageSync('wxuserid') || ''), // 从本地存储获取用户ID
				camp_id: campId
			}
		});
	},

	/**
	 * 重置打卡营进度（新接口）
	 * @param {String} campId - 打卡营ID
	 * @param {String} userId - 用户ID
	 * @param {Boolean} confirm - 是否确认
	 */
	resetCampProgress: (campId, userId, confirm = true) => {
		return request({
			url: `/camp/user_camp/reset_progress`,
			method: 'POST',
			data: {
				user_id: String(userId || wx.getStorageSync('wxuserid') || ''),
				camp_id: String(campId),
				confirm: confirm
			}
		});
	},

	/**
	 * 重启打卡营（旧接口，已废弃）
	 * @deprecated 请使用 resetCampProgress
	 */
	restartCamp: (campId) => {
		return request({
			url: `/camp/${campId}/restart`,
			method: 'POST'
		});
	},

	// ==================== 小节相关 ====================

	/**
	 * 获取打卡营的小节列表（课程列表）
	 * @param {String} campId - 打卡营ID
	 * @param {String} userId - 用户ID（可选，如果不传则从本地存储获取）
	 */
	getCampCourses: (campId, userId) => {
		const user_id = String(userId || wx.getStorageSync('wxuserid') || '');
		// 根据 proto 定义，使用 /camp/sections 接口，通过 camp_id 查询参数
		return request({
			url: `/camp/sections?camp_id=${campId}&page=1&page_size=10&user_id=${encodeURIComponent(user_id)}`,
			method: 'GET'
		});
	},

	/**
	 * 检查是否可开启小节（后端查库：上一小节是否完成等）
	 * @param {String} campId - 打卡营ID
	 * @param {String} sectionId - 小节ID
	 * @returns {Promise<{ success: boolean, can_unlock: boolean, message: string }>}
	 */
	canUnlockSection: (campId, sectionId) => {
		return request({
			url: `/camp/can_unlock_section`,
			method: 'POST',
			data: {
				user_id: String(wx.getStorageSync('wxuserid') || ''),
				camp_id: campId,
				section_id: sectionId
			}
		});
	},

	/**
	 * 检查任务是否可以开始（前置任务是否已完成）
	 * @param {String} taskId - 任务ID
	 * @returns {Promise<{ success: boolean, can_start: boolean, reason: string }>}
	 */
	canStartTask: (taskId) => {
		return request({
			url: `/camp/can_start_task`,
			method: 'POST',
			data: {
				user_id: String(wx.getStorageSync('wxuserid') || ''),
				task_id: taskId
			}
		});
	},

	/**
	 * 购买小节（开启第一小节）
	 * @param {String} campId - 打卡营ID
	 * @param {String} sectionId - 小节ID
	 */
	purchaseSection: (campId, sectionId) => {
		return request({
			url: `/camp/purchase_section`,
			method: 'POST',
			data: {
				user_id: String(wx.getStorageSync('wxuserid') || ''),
				camp_id: campId,
				section_id: sectionId
			}
		});
	},

	/**
	 * 获取用户在某营的小节可访问/已购列表
	 * @param {String} campId - 打卡营ID
	 * @param {Number} page - 页码
	 * @param {Number} page_size - 每页数量
	 */
	listUserSectionAccess: (campId, page = 1, page_size = 1000) => {
		return request({
			url: `/camp/list_user_section_access`,
			method: 'POST',
			data: {
				user_id: String(wx.getStorageSync('wxuserid') || ''),
				camp_id: campId,
				page,
				page_size
			}
		});
	},

	/**
	 * 获取每个小节的完成状态
	 * @param {String} campId - 打卡营ID
	 * @param {String} userId - 用户ID
	 */
	getSectionUserStatus: (campId, userId) => {
		return request({
			url: `/camp/section/user-status`,
			method: 'POST',
			data: {
				camp_id: String(campId),
				user_id: String(userId || wx.getStorageSync('wxuserid') || '')
			}
		});
	},

	/**
	 * 根据课程小节ID获取用户与课程小节的关联关系
	 * @param {String} courseIds - 课程ID列表（逗号分隔）
	 * @param {String} userId - 用户ID（可选，如果不传则从本地存储获取）
	 */
	getCourseUserRelations: (courseIds, userId) => {
		const user_id = String(userId || wx.getStorageSync('wxuserid') || '');
		return request({
			url: `/camp/course/user-course-relations?course_ids=${courseIds}&user_id=${encodeURIComponent(user_id)}`,
			method: 'GET',
		});
	},

	/**
	 * 获取课程完成状态
	 * @param {String} campId - 打卡营ID
	 * @param {String} courseId - 课程ID
	 */
	getCourseCompleted: (campId, courseId) => {
		return request({
			url: `/camp/${campId}/course/${courseId}/completed`,
			method: 'GET'
		});
	},

	// ==================== 任务相关 ====================

	/**
	 * 获取任务详情（需要 campId 和 courseId）
	 * @param {String} campId - 打卡营ID
	 * @param {String} courseId - 课程ID
	 * @param {String} taskId - 任务ID
	 * @param {String} taskType - 任务类型
	 */
	getTaskDetail: (campId, courseId, taskId, taskType) => {
		return request({
			url: `/camp/${campId}/course/${courseId}/tasks/${taskId}?task_type=${taskType.toUpperCase()}`,
			method: 'GET',
		});
	},

	/**
	 * 按任务ID直接获取任务详情（无需 campId/courseId）
	 * @param {String} taskId - 任务ID
	 * @param {String} userId - 用户ID（可选，如果不传则从本地存储获取）
	 */
	getTaskDetailById: (taskId, userId) => {
		const user_id = String(userId || wx.getStorageSync('wxuserid') || '');
		return request({
			url: `/camp/tasks/detail?id=${taskId}&user_id=${encodeURIComponent(user_id)}`,
			method: 'GET',
		});
	},

	/**
	 * 根据任务ID获取任务与用户的关联关系
	 * @param {String} taskIds - 任务ID列表（逗号分隔）
	 * @param {String} userId - 用户ID（可选，如果不传则从本地存储获取）
	 */
	getCampTaskUserRelations: (taskIds, userId) => {
		const user_id = String(userId || wx.getStorageSync('wxuserid') || '');
		return request({
			url: `/camp/task/user_task?task_ids=${taskIds}&user_id=${encodeURIComponent(user_id)}`,
			method: 'GET',
		});
	},

	// ==================== 任务进度相关 ====================

	/**
	 * 获取用户任务进度详情
	 * @param {String} userId - 用户ID
	 * @param {String} taskId - 任务ID
	 */
	getProgressDetail: (userId, taskId) => {
		// GET 请求的参数作为 query 参数传递（兼容微信小程序，不使用 URLSearchParams）
		const user_id = encodeURIComponent(String(userId));
		const task_id = encodeURIComponent(String(taskId));
		return request({
			url: `/camp/progress/info?user_id=${user_id}&task_id=${task_id}`,
			method: 'GET'
		});
		// 注意：request.js 已处理，当 success=false 时不会显示错误提示（没有进度是正常情况）
	},

	/**
	 * 更新任务通用进度
	 * @param {Object} data - 进度数据
	 */
	updateCampProgress: (data) => {
		return request({
			url: `/camp/progress/update`,
			method: 'POST',
			data: data
		});
	},

	/**
	 * 重置任务进度（用户重新答题）
	 * @param {Object} data - 重置数据
	 */
	resetTaskProgress: (data) => {
		return request({
			url: `/camp/reset_task_progress`,
			method: 'POST',
			data: data
		});
	},

	// ==================== 任务类型特定接口 ====================

	/**
	 * 更新视频任务进度
	 * @param {String} campId - 打卡营ID
	 * @param {String} courseId - 课程ID
	 * @param {String} taskId - 任务ID
	 * @param {Object} data - 进度数据
	 */
	updateVideoProgress: (campId, courseId, taskId, data) => {
		return request({
			url: `/camp/${campId}/course/${courseId}/tasks/${taskId}/video`,
			method: 'POST',
			data: data
		});
	},

	/**
	 * 更新文本图片任务进度
	 * @param {String} campId - 打卡营ID
	 * @param {String} courseId - 课程ID
	 * @param {String} taskId - 任务ID
	 * @param {Object} data - 进度数据
	 */
	updateTextImageProgress: (campId, courseId, taskId, data) => {
		return request({
			url: `/camp/${campId}/course/${courseId}/tasks/${taskId}/text-image`,
			method: 'POST',
			data: data
		});
	},

	/**
	 * 更新主观题任务进度
	 * @param {String} campId - 打卡营ID
	 * @param {String} courseId - 课程ID
	 * @param {String} taskId - 任务ID
	 * @param {Object} data - 进度数据
	 */
	updateSubjectiveQuestionProgress: (campId, courseId, taskId, data) => {
		return request({
			url: `/camp/${campId}/course/${courseId}/tasks/${taskId}/subjective`,
			method: 'POST',
			data: data
		});
	},

	/**
	 * 更新申论任务进度
	 * @param {String} campId - 打卡营ID
	 * @param {String} courseId - 课程ID
	 * @param {String} taskId - 任务ID
	 * @param {Object} data - 进度数据
	 */
	updateEssayProgress: (campId, courseId, taskId, data) => {
		return request({
			url: `/camp/${campId}/course/${courseId}/tasks/${taskId}/essay-question/essay`,
			method: 'POST',
			data: data
		});
	},

	/**
	 * 更新客观题任务进度
	 * @param {String} campId - 打卡营ID
	 * @param {String} courseId - 课程ID
	 * @param {String} taskId - 任务ID
	 * @param {Object} data - 进度数据
	 */
	updateObjectiveQuestionProgress: (campId, courseId, taskId, data) => {
		return request({
			url: `/camp/${campId}/course/${courseId}/tasks/${taskId}/objective`,
			method: 'POST',
			data: data
		});
	},

	// ==================== 任务答案相关 ====================

	/**
	 * 获取主观题任务的用户答案
	 * @param {String} campId - 打卡营ID
	 * @param {String} courseId - 课程ID
	 * @param {String} taskId - 任务ID
	 */
	getSubjectiveTaskUserAnswer: (campId, courseId, taskId) => {
		return request({
			url: `/camp/${campId}/course/${courseId}/tasks/${taskId}/subjective/user-answer`,
			method: 'GET',
		});
	},

	/**
	 * 获取申论题任务所有问题的用户答案
	 * @param {String} campId - 打卡营ID
	 * @param {String} courseId - 课程ID
	 * @param {String} taskId - 任务ID
	 */
	getEssayQuestionUserAnswer: (campId, courseId, taskId) => {
		return request({
			url: `/camp/${campId}/course/${courseId}/tasks/${taskId}/essay-question/user-answer`,
			method: 'GET',
		});
	},

	/**
	 * 获取申论题任务是否需要审核
	 * @param {String} campId - 打卡营ID
	 * @param {String} courseId - 课程ID
	 * @param {String} taskId - 任务ID
	 */
	getEssayTaskReviewStatus: (campId, courseId, taskId) => {
		return request({
			url: `/camp/${campId}/course/${courseId}/tasks/${taskId}/essay-question/need-audit`,
			method: 'GET',
		});
	},

	/**
	 * 获取客观题答题结算结果
	 * @param {String} campId - 打卡营ID
	 * @param {String} courseId - 课程ID
	 * @param {String} taskId - 任务ID
	 */
	getObjectiveQuestionSettlementResult: (campId, courseId, taskId) => {
		return request({
			url: `/camp/${campId}/course/${courseId}/tasks/${taskId}/objective/settlement-result`,
			method: 'GET',
		});
	},

	// ==================== 订单相关 ====================

	/**
	 * 创建订单（打卡营小节）
	 * @param {Object} orderData - 订单数据
	 */
	createOrder: (orderData) => {
		return request({
			url: `/order/create`,
			method: 'POST',
			data: orderData
		});
	},

	/**
	 * 取消订单
	 * @param {Object} orderData - 订单数据
	 */
	cancelOrder: (orderData) => {
		return request({
			url: `/order/cancel`,
			method: 'POST',
			data: orderData
		});
	},

	// ==================== 支付相关 ====================

	/**
	 * 创建支付（获取预支付ID）
	 * @param {Object} paymentData - 支付数据
	 */
	createPayment: (paymentData) => {
		return request({
			url: `/pay/create`,
			method: 'POST',
			data: paymentData
		});
	},

	/**
	 * 创建打卡营小节支付请求订单（已废弃，使用 createOrder + createPayment）
	 * @deprecated 请使用 createOrder + createPayment
	 */
	createCampPayment: (campId, courseId) => {
		return request({
			url: `/camp/${campId}/course/${courseId}/order`,
			method: 'POST',
		});
	},

	/**
	 * 取消支付
	 * @deprecated 请使用 cancelOrder
	 */
	cancelCampPayment: (campId, orderId) => {
		return request({
			url: `/camp/${campId}/order/${orderId}/cancel`,
			method: 'POST',
		});
	},
};
