import { ColumnIsGeneratedAlwaysAs, GetSelection } from "../utils.cjs";
import { GetEffectSchemaType, HandleColumn } from "./column.types.cjs";
import { SelectedFieldsFlat } from "../operations.cjs";
import { View } from "../sql/sql.cjs";
import { Table } from "../table.cjs";
import { Assume, DrizzleTypeError, Simplify } from "../utils.cjs";
import { Column } from "../column.cjs";
import { Struct, Top, UndefinedOr } from "effect/Schema";
import { Schema as Schema$1 } from "effect";

//#region src/effect-schema/schema.types.internal.d.ts
interface Conditions {
  never: (column?: Column) => boolean;
  optional: (column: Column) => boolean;
  nullable: (column: Column) => boolean;
}
type BuildRefineField<T> = T extends Top ? ((schema: T) => Top) | Top : never;
type BuildRefine<TColumns extends Record<string, any>> = { [K in keyof TColumns as TColumns[K] extends Column | SelectedFieldsFlat<Column> | Table | View ? K : never]?: TColumns[K] extends Column ? BuildRefineField<GetEffectSchemaType<TColumns[K]>> : BuildRefine<GetSelection<TColumns[K]>> };
type HandleRefinement<TType extends 'select' | 'insert' | 'update', TRefinement, TColumn extends Column> = TRefinement extends (((schema: any) => infer R extends Top)) ? (TColumn['_']['notNull'] extends true ? R : (Schema$1.NullOr<R>)) extends infer TSchema extends Top ? TType extends 'update' ? Schema$1.optional<UndefinedOr<TSchema>> : TSchema : typeof Schema$1.Any : TRefinement;
type IsRefinementDefined<TRefinements extends Record<string | symbol | number, any> | undefined, TKey extends string | symbol | number> = TRefinements extends object ? TRefinements[TKey] extends Top | Schema$1.optional<Top> | Schema$1.optionalKey<Top> | ((schema: any) => any) ? true : false : false;
type BuildSchema<TType extends 'select' | 'insert' | 'update', TColumns extends Record<string, any>, TRefinements extends Record<string, any> | undefined> = Struct<Simplify<{ readonly [K in keyof TColumns as ColumnIsGeneratedAlwaysAs<TColumns[K]> extends true ? TType extends 'select' ? K : never : K]: TColumns[K] extends infer TColumn extends Column ? IsRefinementDefined<TRefinements, K> extends true ? Assume<HandleRefinement<TType, TRefinements[K & keyof TRefinements], TColumn>, Top | Schema$1.optional<Top> | Schema$1.optionalKey<Top>> : HandleColumn<TType, TColumn> : TColumns[K] extends infer TObject extends SelectedFieldsFlat<Column> | Table | View ? BuildSchema<TType, GetSelection<TObject>, TRefinements extends object ? TRefinements[K & keyof TRefinements] : undefined> : typeof Schema$1.Any }>>;
type NoUnknownKeys<TRefinement extends Record<string, any>, TCompare extends Record<string, any>> = { [K in keyof TRefinement]: K extends keyof TCompare ? TRefinement[K] extends Record<string, Top> ? NoUnknownKeys<TRefinement[K], TCompare[K]> : TRefinement[K] : DrizzleTypeError<`Found unknown key in refinement: "${K & string}"`> };
//#endregion
export { BuildRefine, BuildSchema, Conditions, NoUnknownKeys };
//# sourceMappingURL=schema.types.internal.d.cts.map