import { SupabaseClient as BaseClient, PostgrestResponse } from '@supabase/supabase-js';

interface ClientOptions {
  retries?: number;
  timeout?: number;
  pageSize?: number;
}

interface PaginationOptions {
  page?: number;
  pageSize?: number;
  orderBy?: string;
  ascending?: boolean;
}

interface PaginationResult<T> {
  data: T[];
  pagination: {
    total: number;
    pageSize: number;
    page: number;
    totalPages: number;
  };
}

declare class SupabaseClient {
  constructor(url?: string, key?: string, options?: ClientOptions);
  
  client: BaseClient;
  
  from<T = any>(table: string): {
    select: (...args: any[]) => Promise<PostgrestResponse<T>>;
    insert: (...args: any[]) => Promise<PostgrestResponse<T>>;
    update: (...args: any[]) => Promise<PostgrestResponse<T>>;
    delete: (...args: any[]) => Promise<PostgrestResponse<T>>;
    upsert: (...args: any[]) => Promise<PostgrestResponse<T>>;
  };

  auth(): ReturnType<BaseClient['auth']>;
  storage(): ReturnType<BaseClient['storage']>;
  rpc<T = any>(fn: string, params?: object): Promise<PostgrestResponse<T>>;
  testConnection(): Promise<boolean>;
  hasRealtimeSupport(): Promise<boolean>;

  // Enhanced helper methods
  findOne<T = any>(table: string, query?: object): Promise<T>;
  findMany<T = any>(table: string, query?: object, options?: PaginationOptions): Promise<T[]>;
  createOne<T = any>(table: string, data: object): Promise<T>;
  createMany<T = any>(table: string, records: object[]): Promise<T[]>;
  updateOne<T = any>(table: string, query: object, data: object): Promise<T>;
  updateMany<T = any>(table: string, query: object, data: object): Promise<T[]>;
  deleteOne<T = any>(table: string, query: object): Promise<T>;
  deleteMany<T = any>(table: string, query: object): Promise<T[]>;

  // Pagination
  paginate<T = any>(table: string, query?: object, options?: PaginationOptions): Promise<PaginationResult<T>>;

  // Aggregation
  count(table: string, query?: object): Promise<number>;
  sum(table: string, column: string, query?: object): Promise<number>;
  average(table: string, column: string, query?: object): Promise<number>;

  // Advanced filtering
  search<T = any>(table: string, column: string, query: string, options?: object): Promise<T[]>;
}

declare const instance: SupabaseClient;
export = instance | SupabaseClient;