import {type Mwn, type MwnOptions} from 'mwn';
import type {ApiEditResponse} from 'mwn/build/api_response_types';
import {type loadConfig} from './deploy-util';

type Config = ReturnType<typeof loadConfig>;
type Credentials = Config[keyof Config];

/**
 * @private
 */
const fakeCredentials: Credentials = {
	apiUrl: 'https://your.wiki/api.php',
};

const fakeConfig = Array.from({
	length: Math.floor(Math.random() * 3),
})
	.map<Config>((_, index) => {
		return {
			[`test${index + 1}`]: fakeCredentials,
		};
	})
	.reduce<Config>((config, current) => {
		return {
			...config,
			...current,
		};
	}, {}) satisfies Config;

class FakeApi implements Partial<Mwn> {
	public options: MwnOptions;

	public constructor(credentials: Credentials) {
		this.options = credentials;
	}

	// eslint-disable-next-line class-methods-use-this, @typescript-eslint/no-explicit-any, @typescript-eslint/no-unused-vars
	public delete(title: string | number, summary: string, _options?: any) {
		console.log('    [test] deleting', {
			title,
			summary,
		});
		return Promise.resolve({});
	}

	// eslint-disable-next-line class-methods-use-this
	public getTokensAndSiteInfo() {
		return Promise.resolve();
	}

	// eslint-disable-next-line class-methods-use-this, @typescript-eslint/no-empty-function
	public initOAuth() {}

	// eslint-disable-next-line class-methods-use-this, @typescript-eslint/no-explicit-any, @typescript-eslint/no-unused-vars
	public parseWikitext(content: string, _additionalParams?: any) {
		return Promise.resolve(content);
	}

	// eslint-disable-next-line class-methods-use-this
	public save(
		title: string | number,
		content: string,
		summary?: string,
		// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unused-vars
		_options?: any
	) {
		console.log('    [test] saving', {
			title,
			summary,
		});
		return Promise.resolve<ApiEditResponse>({
			result: content + summary,
			pageid: 0,
			title: title.toString(),
			contentmodel: '',
			nochange: true,
			oldrevid: 0,
			newrevid: 0,
			newtimestamp: '',
		});
	}
}

export {fakeConfig, FakeApi};
