import { renderToString } from 'hono/jsx/dom/server';

import type { Result, Vod } from '@/routes/maccms/type';
import type { DataItem, Route } from '@/types';
import ofetch from '@/utils/ofetch';
import { parseDate } from '@/utils/parse-date';
import timezone from '@/utils/timezone';

const render = (vod: Vod, link: string) => renderToString(<VodDescription vod={vod} link={link} />);

const VodDescription = ({ vod, link }: { vod: Vod; link: string }) => (
    <>
        <a href={link} title="进入官网查看">
            <img src={vod.vod_pic} alt={vod.vod_name} />
        </a>
        <h1>
            {vod.vod_name} <span style="font-size: 0.6em; color: darkred;">{vod.vod_remarks}</span>
        </h1>
        <p>
            <b>别名：</b>
            {vod.vod_sub}
        </p>
        <p>
            <b>导演：</b>
            {vod.vod_director}
        </p>
        <p>
            <b>主演：</b>
            {vod.vod_actor}
        </p>
        <p>
            <b>类型：</b>
            {vod.vod_class}
        </p>
        <p>
            <b>年份：</b>
            {vod.vod_year}
        </p>
        <p>
            <b>地区：</b>
            {vod.vod_area}
        </p>
        <p>
            <b>开播时间：</b>
            {vod.vod_pubdate}
        </p>
        <p>
            <b>更新时间：</b>
            {vod.vod_time}
        </p>
        <p>
            <b>资源主页：</b>
            <a href={link}>{link}</a>
        </p>
        <h3>剧情介绍</h3>
    </>
);

export const route: Route = {
    path: '/:domain/:type?/:size?',
    categories: ['multimedia'],
    example: '/maccms/moduzy.net/2',
    features: {
        requireConfig: false,
        requirePuppeteer: false,
        antiCrawler: false,
        supportBT: false,
        supportPodcast: false,
        supportScihub: false,
    },
    parameters: {
        domain: '采集站域名，可选值如下表',
        type: '类别ID，不同采集站点有不同的类别规则和ID，默认为 0，代表全部类别',
        size: '每次获取的数据条数，上限 100 条，默认 30 条',
    },
    name: '最新资源',
    maintainers: ['hualiong'],
    description: `
::: tip
每个采集站提供的影视类别ID是不同的，即参数中的 \`type\` 是不同的。**可以先访问一次站点提供的采集接口，然后从返回结果中的 \`class\` 字段中的 \`type_id\`获取相应的类别ID**
:::

| 站名                | 域名                                             | 站名             | 域名                                               | 站名           | 域名                                            |
| ------------------- | ------------------------------------------------ | ---------------- | -------------------------------------------------- | -------------- | ----------------------------------------------- |
| 魔都资源网          | [moduzy.net](https://moduzy.net)                 | 华为吧影视资源站 | [hw8.live](https://hw8.live)                       | 360 资源站     | [360zy.com](https://360zy.com)                  |
| jkun 爱坤联盟资源网 | [ikunzyapi.com](https://ikunzyapi.com)           | 奥斯卡资源站     | [aosikazy.com](https://aosikazy.com)               | 飞速资源采集网 | [www.feisuzyapi.com](http://www.feisuzyapi.com) |
| 森林资源网          | [slapibf.com](https://slapibf.com)               | 天空资源采集网   | [api.tiankongapi.com](https://api.tiankongapi.com) | 百度云资源     | [api.apibdzy.com](https://api.apibdzy.com)      |
| 红牛资源站          | [www.hongniuzy2.com](https://www.hongniuzy2.com) | 乐视资源网       | [leshiapi.com](https://leshiapi.com)               | 暴风资源       | [bfzyapi.com](https://bfzyapi.com)              |`,
    handler: async (ctx) => {
        const { domain, type = '0', size = '30' } = ctx.req.param();
        if (!list.has(domain)) {
            throw new Error('非法域名！');
        }

        const res = await ofetch<Result>(`https://${domain}/api.php/provide/vod`, {
            parseResponse: JSON.parse,
            query: { ac: 'detail', t: type, pagesize: Number.parseInt(size) > 100 ? 100 : size },
        });

        const items: DataItem[] = res.list.map((each) => ({
            title: each.vod_name,
            image: each.vod_pic,
            link: `https://${domain}/vod/${each.vod_id}/`,
            guid: each.vod_play_url?.match(/https:\/\/.+?\.m3u8/g)?.at(-1),
            pubDate: timezone(parseDate(each.vod_time, 'YYYY-MM-DD HH:mm:ss'), +8),
            category: [each.type_name, ...each.vod_class!.split(',')],
            description: render(each, `https://${domain}/vod/${each.vod_id}/`) + each.vod_content,
        }));

        return {
            title: `最新${type !== '0' && items.length ? items[0].category![0] : '资源'} - ${domain}`,
            link: `https://${domain}`,
            allowEmpty: true,
            item: items,
        };
    },
};

const list = new Set(['moduzy.net', 'hw8.live', '360zy.com', 'ikunzyapi.com', 'aosikazy.com', 'www.feisuzyapi.com', 'slapibf.com', 'api.tiankongapi.com', 'api.apibdzy.com', 'www.hongniuzy2.com', 'leshiapi.com', 'bfzyapi.com']);
