import { IExecuteFunctions, INodeExecutionData, IDataObject } from 'n8n-workflow';
import { apiRequest } from '../../../../helpers/apiRequest';
import { logger } from '../../../../helpers/logger';
import { handleApiError } from '../../../../helpers/errorHandler';
import { handlePagination } from '../../../../helpers/pagination';
import { filterSitesByName } from '../../../../helpers/siteHelpers';

/**
 * List Sites
 *
 * GET /central/v2/sites
 *
 * @param this The n8n execution context
 * @returns Formatted API response
 */
export async function listSites(this: IExecuteFunctions): Promise<INodeExecutionData[]> {
	try {
		// Get parameters
		const returnAll = this.getNodeParameter('returnAll', 0, false) as boolean;
		const limit = returnAll ? 0 : (this.getNodeParameter('limit', 0, 50) as number);
		const additionalFields = this.getNodeParameter('additionalFields', 0, {}) as IDataObject;

		// Construct query parameters
		const queryParams: IDataObject = {};

		// Add additional fields to query parameters (except site_name - handled by client-side filtering)
		if (additionalFields.calculate_total !== undefined) {
			queryParams.calculate_total = additionalFields.calculate_total as boolean;
		}

		if (additionalFields.sort !== undefined) {
			queryParams.sort = additionalFields.sort as string;
		}

		logger.debug(
			'monitoring:site:listSites',
			`Getting sites with params: ${JSON.stringify(queryParams)}`,
		);

		// Handle pagination
		const results = await handlePagination.call(
			this,
			'/central/v2/sites',
			'GET',
			{},
			queryParams,
			{
				path: ['sites'],
				fallbackPaths: [['data', 'sites'], ['data']],
			},
			returnAll,
			limit,
		);

		// Apply client-side site name filtering if specified
		if (additionalFields.site_name) {
			const siteName = additionalFields.site_name as string;
			logger.debug('monitoring:site:listSites', `Filtering results by site name: ${siteName}`);

			// Filter the results
			const filteredResults = results
				.map((result) => {
					if (result.json && Array.isArray(result.json)) {
						return {
							...result,
							json: filterSitesByName(result.json, siteName),
						};
					} else if (result.json && typeof result.json === 'object') {
						// Handle single site object
						const sites = [result.json];
						const filtered = filterSitesByName(sites, siteName);
						return {
							...result,
							json: filtered.length > 0 ? filtered[0] : null,
						};
					}
					return result;
				})
				.filter((result) => result.json !== null);

			return filteredResults;
		}

		return results;
	} catch (error) {
		logger.error('monitoring:site:listSites:error', { message: error.message });
		return handleApiError.call(this, error, 'Failed to list sites');
	}
}
