/**
 * features/travel/gateway.js
 *
 * 旅游攻略首页接口封装。
 *
 * 接口套用参考项目 e:\NewLive\MLLive\pages\newhome.vue（同一套后端框架：
 * FastAdmin + wanlshop 插件），路径前缀分两类：
 *
 *   A. FastAdmin 主框架原生控制器（不带 /wanlshop 前缀）：
 *      - /appbanner/list             首页 banner
 *      - /appvideolabel/list         圆形分类标签
 *      ↑ 直接用裸路径，让拦截器拼上 appurl（= https://backend.amazewayhk.com/api）
 *
 *   B. wanlshop 插件路由（带 /wanlshop 前缀）：
 *      - /wanlshop/find/find/getList 内容流（热点推荐）
 *      - /wanlshop/live/livelist     直播列表（已被 features/live/gateway.js 用过）
 *      ↑ 走 buildRestPath，由 restPathPrefix=/wanlshop 自动拼
 *
 * 后端没有对应接口时调用者负责 catch + 默认数据兜底（不抛）。
 */

import { get } from '@/core/http/http-client'
import { buildRestPath } from '@/core/config/api-paths'
import appSettings from '@/core/config/app-settings'
import { fetchVideoFeedPage } from '@/features/feed/feed-gateway'
import { stripHtml } from '@/features/feed/clip-normalize'

/** 把后端返回的相对路径补全为完整 CDN URL */
function cdn(path) {
	if (!path) return ''
	if (/^https?:\/\//.test(path)) return path
	if (path.startsWith('//')) return `https:${path}`
	const base = (appSettings.cdnurl || '').replace(/\/$/, '')
	return `${base}${path.startsWith('/') ? path : `/${path}`}`
}

/**
 * 兼容后端返回的多种 envelope：
 *   - 直接数组：       [{...}, {...}]
 *   - {data: [...]}：  { data: [...] }
 *   - {list: [...]}：  { list: [...] }
 *   - 二级 data.data： { data: { data: [...] } }
 */
function unwrapList(payload) {
	if (!payload) return []
	if (Array.isArray(payload)) return payload
	if (Array.isArray(payload.data)) return payload.data
	if (Array.isArray(payload.list)) return payload.list
	if (payload.data && Array.isArray(payload.data.data)) return payload.data.data
	if (payload.data && Array.isArray(payload.data.list)) return payload.data.list
	return []
}

/**
 * 首页 banner（show_type=10 与参考项目一致）
 * 参考 newhome.vue#getBannerData
 */
export async function pullHomeBanners() {
	try {
		const { data, raw } = await get('/appbanner/list', { show_type: '10' })
		const rows = unwrapList(data).length ? unwrapList(data) : unwrapList(raw && raw.res)
		return rows.map((row, idx) => ({
			id: row.id || row.banner_id || idx,
			image: cdn(row.image || row.cover),
			jump_url: row.jump_url || row.link || row.url || '',
			link: row.jump_url || row.link || row.url || '',
			show_type: row.show_type,
			title: row.title || ''
		}))
	} catch (_) {
		return []
	}
}

/**
 * 5 圆形分类（视频标签）
 * 参考 newhome.vue#getMenuData
 *
 * 字段说明（来自参考项目）：
 *   row.id    标签 id
 *   row.name  标签名（"热门景区/游记分享/水上项目/亲子出游/美食特产"）
 *   row.image 圆形背景图
 *   row.icon  图标
 *   row.desc  描述/人数
 */
export async function pullHomeCategories() {
	try {
		const { data, raw } = await get('/appvideolabel/list')
		const rows = unwrapList(data).length ? unwrapList(data) : unwrapList(raw && raw.res)
		return rows.map((row, idx) => ({
			id: row.id || row.label_id || idx,
			name: row.name || row.title || '',
			icon: cdn(row.icon),
			bg: cdn(row.image),
			desc: row.desc || ''
		}))
	} catch (_) {
		return []
	}
}

/**
 * 热点推荐瀑布流（视频内容流）
 * 参考 newhome.vue#getStreamersData
 *
 * @param {object} opts
 * @param {number} opts.page         页码（默认 1）
 * @param {number} opts.pageSize     截取条数（默认 20）
 * @param {string} opts.orderType    排序：'1'=最多点赞，'2'=最佳人气
 * @param {number|string} [opts.isHotDian] 是否热门推荐：0=否，1=是（接口字段 is_hot_dian）
 */
function resolveFeedItemId(item) {
	if (!item) return ''
	const id = item.id != null && item.id !== '' ? item.id : item.find_id
	return id != null && id !== '' ? id : ''
}

function resolveFeedItemTitle(item) {
	if (!item) return ''
	const text = stripHtml(item.content)
	if (text) return text
	const fields = [
		item.title,
		item.name,
		item.label_name,
		item.labelname,
		item.jingdian_name,
		item.jingdian,
		item.video && item.video.title,
		item.shop && item.shop.shopname
	]
	for (let i = 0; i < fields.length; i++) {
		const value = fields[i]
		if (value != null && String(value).trim()) return String(value).trim()
	}
	const label = item.label
	if (label && typeof label === 'object' && label.name) {
		return String(label.name).trim()
	}
	return ''
}

function mapVideoFeedCard(item) {
	const video = (item && item.video) || {}
	const shop = (item && item.shop) || {}
	const user = (item && item.user) || {}
	const images = Array.isArray(item.images) ? item.images : []
	const cover = video.cover_url || images[0] || item.cover || item.image || ''
	return {
		id: resolveFeedItemId(item),
		title: resolveFeedItemTitle(item),
		cover: cdn(cover),
		avatar: cdn(shop.avatar || user.avatar || ''),
		user: shop.shopname || user.nickname || item.username || '游客',
		likes: Number(item.views || item.likes || 0),
		type: item.type || 'video',
		label_id: item.label_id || '',
		raw: item
	}
}

/**
 * 按标签拉取视频列表（圆形分类 → 列表页）
 * 参考 newhome.vue#loadTabData：POST/GET find/find/getList，type=video，label_id
 *
 * @param {object} opts
 * @param {string|number} opts.labelId  标签 id（0 表示全部）
 * @param {number} opts.page
 */
export async function pullLabelVideoPage({ labelId, page = 1 } = {}) {
	const lid = labelId === '' || labelId == null ? 0 : labelId
	const pack = await fetchVideoFeedPage(page, { label_id: lid })
	return {
		rows: pack.rows.map(mapVideoFeedCard),
		currentPage: pack.currentPage,
		lastPage: pack.lastPage
	}
}

export async function pullRecommendVideoPage({ page = 1, orderType = '1', isHotDian, isHotJingdian } = {}) {
	try {
		const filters = { order_type: orderType }
		if (isHotDian != null && isHotDian !== '') {
			filters.is_hot_dian = isHotDian
		}
		if (isHotJingdian != null && isHotJingdian !== '') {
			filters.is_hot_jingdian = isHotJingdian
		}
		const pack = await fetchVideoFeedPage(page, filters)
		return {
			rows: pack.rows
				.map(mapVideoFeedCard)
				.filter((row) => row.id != null && row.id !== '')
				.filter((row) => {
					const url = row.raw && row.raw.video && row.raw.video.url
					return !!(url && String(url).trim())
				}),
			currentPage: pack.currentPage,
			lastPage: pack.lastPage
		}
	} catch (_) {
		return { rows: [], currentPage: 1, lastPage: 1 }
	}
}

export async function pullRecommendations({ page = 1, pageSize = 20, orderType = '1', isHotDian } = {}) {
	const pack = await pullRecommendVideoPage({ page, orderType, isHotDian })
	return pack.rows.slice(0, pageSize)
}

/**
 * 首页服务入口（酒店/机票/货币换算等）
 * GET /other/menuData → { data: [{ name, jump_url, image, type }] }
 * type: 0=系统浏览器, 1=应用内页面(jump_url), 2=应用内 WebView
 */
export async function pullHomeServices() {
	try {
		const { data, raw } = await get('/other/menuData')
		const rows = unwrapList(data).length ? unwrapList(data) : unwrapList(raw && raw.res)
		return rows.map((row, idx) => ({
			id: row.id || `menu-${idx}`,
			name: row.name || '',
			image: cdn(row.image || row.icon),
			link: row.jump_url || row.link || row.url || '',
			type: row.type != null ? row.type : ''
		}))
	} catch (_) {
		return []
	}
}

/**
 * 热门景点横向卡片（与热点推荐同接口 find/find/getList，is_hot_jingdian=1）
 */
export async function pullHotAttractions({ page = 1, pageSize = 12 } = {}) {
	try {
		const pack = await pullRecommendVideoPage({ page, isHotJingdian: 1 })
		return pack.rows
			.slice(0, pageSize)
			.filter((row) => row.id != null && row.id !== '')
			.map((row) => ({
				id: row.id,
				name: row.title || resolveFeedItemTitle(row.raw) || '',
				image: row.cover,
				label_id: row.label_id || '',
				listPage: page,
				raw: row.raw
			}))
	} catch (_) {
		return []
	}
}

export { cdn as resolveTravelCdn }