import { bigintStringModeSchema, bufferSchema, jsonSchema, unsignedBigintStringModeSchema } from "./column.cjs";
import { Assume } from "../utils.cjs";
import { Column } from "../column.cjs";
import { ColumnTypeData, ExtractColumnTypeData } from "../column-builder.cjs";
import { $Array, Literals, NullOr, Struct, Top, Tuple, UndefinedOr, optional } from "effect/Schema";
import { Schema as Schema$1 } from "effect";
import { LiteralValue } from "effect/SchemaAST";

//#region src/effect-schema/column.types.d.ts
type GetArrayDepth<T, Depth extends number = 0> = Depth extends 5 ? 5 : T extends readonly (infer U)[] ? GetArrayDepth<U, [1, 2, 3, 4, 5][Depth]> : Depth;
type WrapInEffectSchemaArray<TSchema extends Top, TDepth extends number> = TDepth extends 0 ? TSchema : TDepth extends 1 ? $Array<TSchema> : TDepth extends 2 ? $Array<$Array<TSchema>> : TDepth extends 3 ? $Array<$Array<$Array<TSchema>>> : TDepth extends 4 ? $Array<$Array<$Array<$Array<TSchema>>>> : TDepth extends 5 ? $Array<$Array<$Array<$Array<$Array<TSchema>>>>> : $Array<typeof Schema$1.Any>;
type IsPgArrayColumn<TColumn extends Column<any>, TType extends ColumnTypeData> = TType['type'] extends 'array' ? false : GetArrayDepth<TColumn['_']['data']> extends 0 ? false : true;
type GetEffectSchemaType<TColumn extends Column<any>, TType extends ColumnTypeData = ExtractColumnTypeData<TColumn['_']['dataType']>> = IsPgArrayColumn<TColumn, TType> extends true ? WrapInEffectSchemaArray<GetBaseEffectSchemaType<TColumn, TType>, GetArrayDepth<TColumn['_']['data']>> : GetBaseEffectSchemaType<TColumn, TType>;
type GetBaseEffectSchemaType<TColumn extends Column<any>, TType extends ColumnTypeData = ExtractColumnTypeData<TColumn['_']['dataType']>> = TType['type'] extends 'array' ? TType['constraint'] extends 'geometry' | 'point' ? Tuple<readonly [typeof Schema$1.Number, typeof Schema$1.Number]> : TType['constraint'] extends 'line' ? Tuple<readonly [typeof Schema$1.Number, typeof Schema$1.Number, typeof Schema$1.Number]> : TType['constraint'] extends 'vector' | 'halfvector' ? $Array<typeof Schema$1.Number> : TType['constraint'] extends 'int64vector' ? $Array<typeof Schema$1.BigInt> : TType['constraint'] extends 'basecolumn' ? TColumn['_'] extends {
  baseColumn: infer TBaseColumn extends Column<any>;
} ? $Array<Assume<GetEffectSchemaType<TBaseColumn>, Top>> : never : $Array<typeof Schema$1.Any> : TType['type'] extends 'object' ? TType['constraint'] extends 'date' ? typeof Schema$1.Date : TType['constraint'] extends 'buffer' ? typeof bufferSchema : TType['constraint'] extends 'point' | 'geometry' ? Struct<{
  readonly x: typeof Schema$1.Number;
  readonly y: typeof Schema$1.Number;
}> : TType['constraint'] extends 'line' ? Struct<{
  readonly a: typeof Schema$1.Number;
  readonly b: typeof Schema$1.Number;
  readonly c: typeof Schema$1.Number;
}> : TType['constraint'] extends 'json' ? typeof jsonSchema : typeof Schema$1.ObjectKeyword : TType['type'] extends 'custom' ? typeof Schema$1.Any : TType['type'] extends 'number' ? (TType['constraint'] extends 'int8' | 'int16' | 'int24' | 'int32' | 'int53' | 'uint8' | 'uint16' | 'uint24' | 'uint32' | 'uint53' | 'year' ? typeof Schema$1.Int : typeof Schema$1.Number) : TType['type'] extends 'bigint' ? typeof Schema$1.BigInt : TType['type'] extends 'boolean' ? typeof Schema$1.Boolean : TType['type'] extends 'string' ? TType['constraint'] extends 'uuid' ? typeof Schema$1.String : TType['constraint'] extends 'enum' ? Literals<Readonly<TColumn['enumValues']> extends infer R extends readonly LiteralValue[] ? R : TColumn['enumValues']> : TType['constraint'] extends 'int64' ? typeof bigintStringModeSchema : TType['constraint'] extends 'uint64' ? typeof unsignedBigintStringModeSchema : typeof Schema$1.String : typeof Schema$1.Any;
type HandleSelectColumn<TSchema extends Top, TColumn extends Column> = TColumn['_']['notNull'] extends true ? TSchema : NullOr<TSchema>;
type HandleInsertColumn<TSchema extends Top, TColumn extends Column> = TColumn['_']['notNull'] extends true ? TColumn['_']['hasDefault'] extends true ? optional<UndefinedOr<TSchema>> : TSchema : optional<UndefinedOr<NullOr<TSchema>>>;
type HandleUpdateColumn<TSchema extends Top, TColumn extends Column> = TColumn['_']['notNull'] extends true ? optional<UndefinedOr<TSchema>> : optional<UndefinedOr<NullOr<TSchema>>>;
type HandleColumn<TType extends 'select' | 'insert' | 'update', TColumn extends Column> = TType extends 'select' ? HandleSelectColumn<GetEffectSchemaType<TColumn>, TColumn> : TType extends 'insert' ? HandleInsertColumn<GetEffectSchemaType<TColumn>, TColumn> : TType extends 'update' ? HandleUpdateColumn<GetEffectSchemaType<TColumn>, TColumn> : GetEffectSchemaType<TColumn>;
//#endregion
export { GetEffectSchemaType, HandleColumn };
//# sourceMappingURL=column.types.d.cts.map