// @ts-nocheck
// ===================================================================
//  夸克网盘 API 统一模块
//  所有夸克 API 端点、请求头、工具函数集中管理
//  换 API 只需改这个文件
// ===================================================================

// ==================== 域名 ====================
// 修改夸克 API 域名只需改下面两行
export const QUARK_DRIVE_HOST = 'https://drive-pc.quark.cn';
export const QUARK_PAN_HOST    = 'https://pan.quark.cn';

// ==================== API 端点路径 ====================
// 所有夸克 API 路径集中在此，换版本只需改这里
export const EP = {
  // ── 账号 ──
  ACCOUNT_INFO:        '/account/info',                          // GET  获取账号信息

  // ── 文件操作 ──
  FILE:                '/1/clouddrive/file',                    // POST 创建文件夹
  FILE_SORT:           '/1/clouddrive/file/sort',               // GET  列出目录文件
  FILE_RENAME:         '/1/clouddrive/file/rename',             // POST 重命名
  FILE_DELETE:         '/1/clouddrive/file/delete',             // POST 永久删除 (action_type=2)
  FILE_TRASH_CLEAR:    '/1/clouddrive/file/trash/clear',        // POST 清空回收站

  // ── 分享 ──
  SHARE:               '/1/clouddrive/share',                   // POST 创建分享链接
  SHARE_PASSWORD:      '/1/clouddrive/share/password',          // POST 设置分享密码
  SHARE_PAGE_TOKEN:    '/1/clouddrive/share/sharepage/token',   // GET  获取分享页 token
  SHARE_PAGE_DETAIL:   '/1/clouddrive/share/sharepage/detail',  // GET  获取分享详情
  SHARE_PAGE_SAVE:     '/1/clouddrive/share/sharepage/save',    // POST 保存分享文件到网盘

  // ── 任务 ──
  TASK:                '/1/clouddrive/task',                    // GET  查询异步任务状态

  // ── 容量 ──
  CAPACITY_DETAIL:     '/1/clouddrive/capacity/detail',         // GET  容量详情
  MEMBER:              '/1/clouddrive/member',                  // GET  会员/容量快速查询
} as const;

// ==================== 请求头 ====================
export function getHeaders(cookie) {
    return {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
        'Cookie': cookie,
        'Accept': 'application/json, text/plain, */*',
        'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
        'Referer': QUARK_PAN_HOST + '/',
        'Origin': QUARK_PAN_HOST,
    };
}

// ==================== 通用参数 ====================
export function getCommonParams() {
    return { pr: 'ucpro', fr: 'pc' };
}

/** 生成浏览器风格的 query string（随机延迟参数） */
export function makeQuery(extra = {}) {
    const __dt = Math.floor(Math.random() * 240000 + 60000);
    const __t = Date.now() / 1000;
    return new URLSearchParams({
        ...getCommonParams(),
        uc_param_str: '',
        app: 'clouddrive',
        __dt: String(__dt),
        __t: String(__t),
        ...extra,
    }).toString();
}

// ==================== 工具函数 ====================
/** 随机延迟 500~2000ms，模拟人类操作 */
export async function humanDelay() {
    const ms = Math.floor(Math.random() * 1500) + 500;
    await new Promise(r => setTimeout(r, ms));
}

/** 生成 4 位数字分享密码 */
export function randomSharePwd() {
    return Math.floor(1000 + Math.random() * 9000).toString();
}

/** 从 Cookie 中提取 kps/sign/vcode */
export function getMparam(cookie) {
    const kpsMatch = cookie.match(/__?kps=([a-zA-Z0-9%+/=]+)/);
    const signMatch = cookie.match(/__?sign=([a-zA-Z0-9%+/=]+)/);
    const vcodeMatch = cookie.match(/__?vcode=([a-zA-Z0-9%+/=]+)/);
    if (kpsMatch && signMatch && vcodeMatch) {
        return {
            kps: kpsMatch[1],
            sign: signMatch[1].replace(/%25/g, '%'),
            vcode: vcodeMatch[1],
        };
    }
    return {};
}

/** 格式化字节为人类可读字符串 */
export function formatBytes(bytes) {
    if (bytes === 0) return '0 B';
    const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
    const i = Math.floor(Math.log(bytes) / Math.log(1024));
    return parseFloat((bytes / Math.pow(1024, i)).toFixed(2)) + ' ' + sizes[i];
}

/** 当天日期文件夹名 (YYYY-MM-DD) */
export function dailyFolderName() {
    const d = new Date();
    const y = d.getFullYear();
    const m = String(d.getMonth() + 1).padStart(2, '0');
    const day = String(d.getDate()).padStart(2, '0');
    return `${y}-${m}-${day}`;
}

/** 随机 12 位字母数字文件夹名 */
export function randomFolderName() {
    const chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
    let name = '';
    for (let i = 0; i < 12; i++) {
        name += chars[Math.floor(Math.random() * chars.length)];
    }
    return name;
}

// ==================== 底层 fetch 封装 ====================
/** 通用 JSON fetch，返回解析后的 body 或 null */
export async function apiFetch(endpoint, options) {
    const { method = 'GET', query, body, cookie, timeout = 10000, host = QUARK_DRIVE_HOST } = options;
    let url = host + endpoint;
    if (query) url += '?' + new URLSearchParams(query).toString();
    try {
        const resp = await fetch(url, {
            method,
            headers: {
                ...getHeaders(cookie),
                ...(body ? { 'Content-Type': 'application/json' } : {}),
            },
            body: body ? JSON.stringify(body) : undefined,
            signal: AbortSignal.timeout(timeout),
        });
        if (!resp.ok) return null;
        return await resp.json();
    } catch {
        return null;
    }
}

// ==================== 目录操作 ====================
/** 列出指定目录下的文件（单页） */
export async function listDir(cookie, pdirFid, page = 1, pageSize = 50) {
    try {
        const params = new URLSearchParams({
            ...getCommonParams(),
            uc_param_str: '',
            pdir_fid: pdirFid,
            _page: String(page),
            _size: String(pageSize),
            _fetch_total: '1',
            _fetch_sub_dirs: '0',
            _sort: 'file_type:asc,updated_at:desc',
            fetch_all_file: '1',
            fetch_risk_file_name: '1',
        });
        const resp = await fetch(QUARK_DRIVE_HOST + EP.FILE_SORT + '?' + params.toString(), {
            headers: getHeaders(cookie),
            signal: AbortSignal.timeout(15000),
        });
        if (!resp.ok) return [];
        const data = await resp.json();
        if (data.status !== 200) return [];
        return (data.data?.list || []).filter(f => f.fid).map(f => ({
            fid: f.fid,
            file_name: f.file_name,
            share_fid_token: '',
            dir: f.dir || false,
            size: f.size || 0,
        }));
    } catch {
        return [];
    }
}

/** 列出根目录文件 */
export async function listRootDir(cookie) {
    try {
        const params = new URLSearchParams({
            pr: 'ucpro', fr: 'pc',
            pdir_fid: '0',
            _page: '1', _size: '200',
            _fetch_total: '1', _fetch_sub_dirs: '0',
            _sort: 'file_type:asc,updated_at:desc',
            fetch_all_file: '1',
            fetch_risk_file_name: '1',
        });
        const resp = await fetch(QUARK_DRIVE_HOST + EP.FILE_SORT + '?' + params.toString(), {
            headers: getHeaders(cookie),
            signal: AbortSignal.timeout(15000),
        });
        if (!resp.ok) return [];
        const data = await resp.json();
        if (data.status !== 200 || !data.data?.list) return [];
        return (data.data.list || []).map(f => ({
            fid: f.fid,
            file_name: f.file_name,
            dir: f.dir || false,
            size: f.size || 0,
        }));
    } catch {
        return [];
    }
}

/** 列出目录全部文件（自动翻页） */
export async function listDirAllPages(cookie, pdirFid) {
    const allFiles = [];
    let page = 1;
    const pageSize = 100;
    let total = -1;
    while (total === -1 || (page - 1) * pageSize < total) {
        const files = await listDir(cookie, pdirFid, page, pageSize);
        if (!files.length) break;
        allFiles.push(...files);
        if (total === -1) total = files.length;
        page++;
    }
    return allFiles;
}

// ==================== 高级操作封装 ====================
/**
 * 永久删除文件/文件夹
 * @param cookie 认证 cookie
 * @param fids   要删除的文件/文件夹 fid 数组
 */
export async function permanentDelete(cookie, fids) {
    if (!fids.length) return true;
    try {
        const resp = await fetch(QUARK_DRIVE_HOST + EP.FILE_DELETE + '?' + makeQuery(), {
            method: 'POST',
            headers: { ...getHeaders(cookie), 'Content-Type': 'application/json' },
            body: JSON.stringify({ action_type: 2, filelist: fids }),
            signal: AbortSignal.timeout(30000),
        });
        if (!resp.ok) return false;
        const data = await resp.json();
        return data.status === 200;
    } catch (err) {
        console.error('[Quark] permanentDelete error:', err.message);
        return false;
    }
}

/**
 * 清空回收站
 */
export async function emptyTrashApi(cookie) {
    try {
        const resp = await fetch(QUARK_DRIVE_HOST + EP.FILE_TRASH_CLEAR + '?' + makeQuery(), {
            method: 'POST',
            headers: { ...getHeaders(cookie), 'Content-Type': 'application/json' },
            body: JSON.stringify({}),
            signal: AbortSignal.timeout(60000),
        });
        if (!resp.ok) return false;
        const data = await resp.json();
        return data.status === 200;
    } catch (err) {
        console.error('[Quark] emptyTrashApi error:', err.message);
        return false;
    }
}

/**
 * 创建文件夹
 * @returns 成功返回 { fid, file_name }，失败返回 null
 */
export async function quarkCreateDir(cookie, dirName, pdirFid = '0') {
    try {
        const resp = await fetch(QUARK_DRIVE_HOST + EP.FILE + '?' + makeQuery(), {
            method: 'POST',
            headers: { ...getHeaders(cookie), 'Content-Type': 'application/json' },
            body: JSON.stringify({ pdir_fid: pdirFid, file_name: dirName, dir: true, dir_path: '' }),
            signal: AbortSignal.timeout(10000),
        });
        const data = await resp.json();
        if (data.status === 200 && data.data?.fid) {
            return { fid: data.data.fid, file_name: dirName };
        }
        console.log('[Quark] quarkCreateDir failed: status=' + data.status + ' msg=' + data.message);
        return null;
    } catch (err) {
        console.error('[Quark] quarkCreateDir error:', err.message);
        return null;
    }
}

/**
 * 获取会员/容量信息 (快速接口)
 */
export async function getMemberInfo(cookie) {
    try {
        const params = new URLSearchParams({ pr: 'ucpro', fr: 'pc', uc_param_str: '', __t: String(Date.now()), __dt: '1000' });
        const resp = await fetch(QUARK_PAN_HOST + EP.MEMBER + '?' + params.toString(), {
            headers: getHeaders(cookie),
            signal: AbortSignal.timeout(10000),
        });
        if (!resp.ok) return null;
        const data = await resp.json();
        if (data.status === 200 && data.data) {
            return {
                usedBytes: data.data.use_capacity ?? 0,
                totalBytes: data.data.total_capacity ?? 0,
            };
        }
        return null;
    } catch {
        return null;
    }
}

/**
 * 获取账号信息 (验证 cookie 有效性)
 */
export async function getAccountInfo(cookie) {
    const url = QUARK_PAN_HOST + EP.ACCOUNT_INFO + '?fr=pc&platform=pc';
    try {
        const resp = await fetch(url, { headers: getHeaders(cookie), signal: AbortSignal.timeout(10000) });
        if (resp.ok) {
            const data = await resp.json();
            if (data.status === 200 && data.data) return data.data;
        }
        return null;
    } catch {
        return null;
    }
}
