import { BaseRecord, CreateManyParams, CreateManyResponse, CreateParams, CreateResponse, DataProvider, DeleteManyParams, DeleteManyResponse, DeleteOneParams, DeleteOneResponse, GetListParams, GetListResponse, GetManyParams, GetManyResponse, GetOneParams, GetOneResponse, UpdateManyParams, UpdateManyResponse, UpdateParams, UpdateResponse } from '@refinedev/core';
import type { UnstableGetResult } from '@supabase/postgrest-js';
import { SupabaseClient } from '@supabase/supabase-js';
import { GenericSchema } from '@supabase/supabase-js/dist/module/lib/types';
/**
 * The provider to use.
 */
type Provider = 'sdk' | 'supabase';
/**
 * supabaseのセレクターから取得する型を取得する
 */
export type TablesSelect<Schema extends GenericSchema, TableName extends keyof Schema['Tables'], Query extends string> = UnstableGetResult<Schema, Schema['Tables'][TableName]['Row'], TableName, Schema['Tables'][TableName] extends {
    Relationships: infer R;
} ? R : never, Query, {
    PostgrestVersion: '12';
}>;
/**
 * DataProviderで使用するキー
 */
export type DataProviderKey = Exclude<keyof Required<DataProvider>, 'getApiUrl' | 'custom'>;
/**
 * BffProviderOptions
 */
export interface BffProviderOptions {
    /**
     * The default provider to use.
     *
     * @default 'supabase'
     */
    defaultProvider?: Provider;
}
/**
 * Override the provider for a resource.
 */
export type OverrideProvider<TSupabaseClient extends SupabaseClient, TSdkClient> = Record<string, OverrideMethod<TSupabaseClient, TSdkClient> & BeforeParams>;
/**
 * The params change for before execute.
 */
interface BeforeParams {
    onBeforeParams?: <T extends Parameters<Required<DataProvider>[DataProviderKey]>[0]>(params: T) => T;
}
/**
 * Override the method for a resource.
 * If the method is not overridden, the default provider will be used.
 */
export interface OverrideMethod<TSupabaseClient extends SupabaseClient, TSdkClient> {
    getList?: ((params: {
        supabase: TSupabaseClient;
        sdk: TSdkClient;
        params: GetListParams;
    }) => Promise<GetListResponse<BaseRecord>>) | Provider;
    getMany?: ((params: {
        supabase: TSupabaseClient;
        sdk: TSdkClient;
        params: GetManyParams;
    }) => Promise<GetManyResponse<BaseRecord>>) | Provider;
    getOne?: ((params: {
        supabase: TSupabaseClient;
        sdk: TSdkClient;
        params: GetOneParams;
    }) => Promise<GetOneResponse<BaseRecord>>) | Provider;
    create?: ((params: {
        supabase: TSupabaseClient;
        sdk: TSdkClient;
        params: CreateParams<any>;
    }) => Promise<CreateResponse<BaseRecord>>) | Provider;
    createMany?: ((params: {
        supabase: TSupabaseClient;
        sdk: TSdkClient;
        params: CreateManyParams<any>;
    }) => Promise<CreateManyResponse<BaseRecord>>) | Provider;
    update?: ((params: {
        supabase: TSupabaseClient;
        sdk: TSdkClient;
        params: UpdateParams<any>;
    }) => Promise<UpdateResponse<BaseRecord>>) | Provider;
    updateMany?: ((params: {
        supabase: TSupabaseClient;
        sdk: TSdkClient;
        params: UpdateManyParams<any>;
    }) => Promise<UpdateManyResponse<BaseRecord>>) | Provider;
    deleteOne?: ((params: {
        supabase: TSupabaseClient;
        sdk: TSdkClient;
        params: DeleteOneParams<any>;
    }) => Promise<DeleteOneResponse<BaseRecord>>) | Provider;
    deleteMany?: ((params: {
        supabase: TSupabaseClient;
        sdk: TSdkClient;
        params: DeleteManyParams<any>;
    }) => Promise<DeleteManyResponse<BaseRecord>>) | Provider;
}
export {};
