import {
	PayForPressConfig,
	UserResponse,
	UserUpdate,
	SearchParams,
	ArticleResponse,
	ArticlesResponse,
	ArticleFilters,
	AppearanceSchema,
	TargetingSchema,
	SettingsResponse,
	OrganizationDetails,
	PaymentResponse,
	PaymentCreateParams,
	PaymentSearchParams,
	PaymentsResponse,
	Article
} from './types';
import { PayForPressClient } from './client';

export class PayForPress extends PayForPressClient {
	constructor(config: PayForPressConfig) {
		super(config);
	}

	// User Management
	async getUser(params: { email?: string; id?: string }): Promise<UserResponse> {
		return this.post('/users/get', params);
	}

	async createUser(user: UserUpdate): Promise<UserResponse> {
		return this.post('/users/create', user);
	}

	async updateUser(id: string, user: UserUpdate): Promise<UserResponse> {
		return this.post('/users/update', { id, newProps: user });
	}

	async deleteUser(id: string): Promise<{ success: boolean; message: string }> {
		return this.post('/users/delete', { id });
	}

	async searchUsers(
		params: SearchParams
	): Promise<{ success: boolean; users: any[]; total: number }> {
		return this.post('/users/search', params);
	}

	// Article Management
	async getArticle(
		params: { id?: string; url?: string } | ArticleFilters
	): Promise<ArticleResponse | ArticlesResponse> {
		return this.post('/articles/get', params);
	}

	async createArticle(url: string): Promise<ArticleResponse> {
		return this.post('/articles/create', { url });
	}

	async updateArticle(id: string, article: Partial<Article>): Promise<ArticleResponse> {
		return this.post('/articles/update', { id, ...article });
	}

	async deleteArticle(id: string): Promise<{ success: boolean }> {
		return this.post('/articles/delete', { id });
	}

	// Appearance Settings
	async getAppearance(): Promise<{ success: boolean; appearance: AppearanceSchema }> {
		return this.post('/appearance/get');
	}

	async updateAppearance(
		appearance: AppearanceSchema
	): Promise<{ success: boolean; appearance: AppearanceSchema }> {
		return this.post('/appearance/update', appearance);
	}

	// Targeting Settings
	async getTargeting(): Promise<{ targeting: TargetingSchema }> {
		return this.post('/targeting/get');
	}

	async updateTargeting(
		targeting: TargetingSchema
	): Promise<{ message: string; targeting: TargetingSchema }> {
		return this.post('/targeting/update', { targeting });
	}

	// Organization Settings
	async getSettings(): Promise<SettingsResponse> {
		return this.post('/settings/get');
	}

	async updateSettings(settings: OrganizationDetails): Promise<SettingsResponse> {
		return this.post('/settings/update', settings);
	}

	// Payment Management
	async createPayment(params: PaymentCreateParams): Promise<PaymentResponse> {
		return this.post('/payments/create', params);
	}

	async getPayment(id: string): Promise<PaymentResponse> {
		return this.post('/payments/get', { id });
	}

	async searchPayments(params: PaymentSearchParams): Promise<PaymentsResponse> {
		return this.post('/payments/search', params);
	}

	// Analytics
	async getAnalytics(params: {
		type: 'get' | 'search';
		startDate?: string;
		endDate?: string;
	}): Promise<{ success: boolean; data: any }> {
		return this.post('/analytics', params);
	}
}

export * from './types';
