import {ApiUrlBase, IBidTask, IResp, ITask, TaskTypeKey, UseHistoryMockKey} from "/src-com";
import {StorageLocal} from "gs-br-ext";
import {Db} from "/src-com/db";
import {isNumber} from "gs-base";

const TaskKey = 'remoteTask';

export class RemoteTask {
	static async get(reserve: boolean = false): Promise<ITask | undefined> {
		// 检查是否开启模拟数据
		const useMock = await StorageLocal.getValue(UseHistoryMockKey);
		if (useMock !== false) {
			const data = await this.getMockTask(useMock);
			if (data) {
				return data;
			}
		}

		// 原有逻辑
		const taskType = await StorageLocal.getValue(TaskTypeKey)
		const url = new URL(`${ApiUrlBase}/task/get`);
		if (reserve) {
			url.searchParams.append('reserve', '1');
		}
		if (taskType) {
			url.searchParams.append('type', taskType);
		}
		const httpResp = await fetch(url);
		if (!httpResp.ok) {
			throw new Error(httpResp.statusText);
		}
		const resp: IResp<ITask> = await httpResp.json();
		if (resp.code != 200) {
			throw new Error(resp.message);
		}
		const {data} = resp || {} as IResp<ITask>;
		await StorageLocal.setValue(TaskKey, data);
		return data;
	}

	// noinspection JSUnusedLocalSymbols
	static async end(task: ITask): Promise<void> {
	}

	// 获取模拟任务数据
	private static async getMockTask(useMock: boolean | number): Promise<IBidTask | undefined> {
		try {
			// 从历史记录中随机获取一条数据
			const mockData = await Db.bidTaskAddedHistory.batchRead(async (store) => {
				if(isNumber(useMock)) {
					return await store.get(useMock as number);
				}
				const count = await store.count();
				if (count === 0) return null;
				const randomIndex = Math.ceil(Math.random() * count);
				return await store.get(randomIndex);
			});

			if (!mockData) {
				return undefined;
			}

			// 转换为IBidTask类型
			const bidTask: IBidTask = {
				id: `mock-${Date.now()}`,
				type: mockData.taskType === 0 ? 'bid' : 'buyItNow',
				params: {
					goodsId: mockData.goodsId,
					bid: mockData.bid
				}
			};

			console.log('生成的模拟任务:', bidTask);
			await StorageLocal.setValue(TaskKey, bidTask);
			return bidTask;
		} catch (error) {
			console.error('获取模拟任务失败:', error);
			return undefined;
		}
	}
}
