// src/transformers/cleaner.ts
import { ICleaner, PipelineContext } from '../core/interfaces';

// Example: Remove items with null/undefined in specific required fields
export class RequiredFieldCleaner<TInput extends object> implements ICleaner<TInput> {
    private requiredFields: (keyof TInput)[];

    constructor(...requiredFields: (keyof TInput)[]) {
        this.requiredFields = requiredFields;
    }

    async clean(data: TInput, context: PipelineContext): Promise<TInput | null> {
        for (const field of this.requiredFields) {
            if (data[field] === null || data[field] === undefined) {
                context.logger.warn({ field, item: data }, `Item failed validation: Required field '${String(field)}' is missing. Filtering out.`);
                return null; // Filter out this item
            }
        }
        return data; // Item is valid
    }
}

// Example: Set default values
export class DefaultValueCleaner<TInput extends object> implements ICleaner<TInput> {
     private defaults: Partial<TInput>;

     constructor(defaults: Partial<TInput>) {
        this.defaults = defaults;
     }

    async clean(data: TInput, context: PipelineContext): Promise<TInput> {
        let changed = false;
        for(const key in this.defaults) {
            const field = key as keyof TInput;
            if(data[field] === null || data[field] === undefined) {
                 data[field] = this.defaults[field]!; // Apply default
                 changed = true;
            }
        }
        if (changed) {
             context.logger.trace({ item: data }, `Applied default values.`);
        }
        return data;
    }
}