package bun

import (
	
	

	
	
)

type CreateIndexQuery struct {
	whereBaseQuery

	unique       bool
	fulltext     bool
	spatial      bool
	concurrently bool
	ifNotExists  bool

	index   schema.QueryWithArgs
	using   schema.QueryWithArgs
	include []schema.QueryWithArgs
}

func ( *DB) *CreateIndexQuery {
	 := &CreateIndexQuery{
		whereBaseQuery: whereBaseQuery{
			baseQuery: baseQuery{
				db:   ,
				conn: .DB,
			},
		},
	}
	return 
}

func ( *CreateIndexQuery) ( IConn) *CreateIndexQuery {
	.setConn()
	return 
}

func ( *CreateIndexQuery) ( interface{}) *CreateIndexQuery {
	.setTableModel()
	return 
}

func ( *CreateIndexQuery) () *CreateIndexQuery {
	.unique = true
	return 
}

func ( *CreateIndexQuery) () *CreateIndexQuery {
	.concurrently = true
	return 
}

func ( *CreateIndexQuery) () *CreateIndexQuery {
	.ifNotExists = true
	return 
}

//------------------------------------------------------------------------------

func ( *CreateIndexQuery) ( string) *CreateIndexQuery {
	.index = schema.UnsafeIdent()
	return 
}

func ( *CreateIndexQuery) ( string,  ...interface{}) *CreateIndexQuery {
	.index = schema.SafeQuery(, )
	return 
}

//------------------------------------------------------------------------------

func ( *CreateIndexQuery) ( ...string) *CreateIndexQuery {
	for ,  := range  {
		.addTable(schema.UnsafeIdent())
	}
	return 
}

func ( *CreateIndexQuery) ( string,  ...interface{}) *CreateIndexQuery {
	.addTable(schema.SafeQuery(, ))
	return 
}

func ( *CreateIndexQuery) ( string,  ...interface{}) *CreateIndexQuery {
	.modelTable = schema.SafeQuery(, )
	return 
}

func ( *CreateIndexQuery) ( string,  ...interface{}) *CreateIndexQuery {
	.using = schema.SafeQuery(, )
	return 
}

//------------------------------------------------------------------------------

func ( *CreateIndexQuery) ( ...string) *CreateIndexQuery {
	for ,  := range  {
		.addColumn(schema.UnsafeIdent())
	}
	return 
}

func ( *CreateIndexQuery) ( string,  ...interface{}) *CreateIndexQuery {
	.addColumn(schema.SafeQuery(, ))
	return 
}

func ( *CreateIndexQuery) ( ...string) *CreateIndexQuery {
	.excludeColumn()
	return 
}

//------------------------------------------------------------------------------

func ( *CreateIndexQuery) ( ...string) *CreateIndexQuery {
	for ,  := range  {
		.include = append(.include, schema.UnsafeIdent())
	}
	return 
}

func ( *CreateIndexQuery) ( string,  ...interface{}) *CreateIndexQuery {
	.include = append(.include, schema.SafeQuery(, ))
	return 
}

//------------------------------------------------------------------------------

func ( *CreateIndexQuery) ( string,  ...interface{}) *CreateIndexQuery {
	.addWhere(schema.SafeQueryWithSep(, , " AND "))
	return 
}

func ( *CreateIndexQuery) ( string,  ...interface{}) *CreateIndexQuery {
	.addWhere(schema.SafeQueryWithSep(, , " OR "))
	return 
}

//------------------------------------------------------------------------------

func ( *CreateIndexQuery) () string {
	return "CREATE INDEX"
}

func ( *CreateIndexQuery) ( schema.Formatter,  []byte) ( []byte,  error) {
	if .err != nil {
		return nil, .err
	}

	 = append(, "CREATE "...)

	if .unique {
		 = append(, "UNIQUE "...)
	}
	if .fulltext {
		 = append(, "FULLTEXT "...)
	}
	if .spatial {
		 = append(, "SPATIAL "...)
	}

	 = append(, "INDEX "...)

	if .concurrently {
		 = append(, "CONCURRENTLY "...)
	}
	if .ifNotExists {
		 = append(, "IF NOT EXISTS "...)
	}

	,  = .index.AppendQuery(, )
	if  != nil {
		return nil, 
	}

	 = append(, " ON "...)
	,  = .appendFirstTable(, )
	if  != nil {
		return nil, 
	}

	if !.using.IsZero() {
		 = append(, " USING "...)
		,  = .using.AppendQuery(, )
		if  != nil {
			return nil, 
		}
	}

	 = append(, " ("...)
	for ,  := range .columns {
		if  > 0 {
			 = append(, ", "...)
		}
		,  = .AppendQuery(, )
		if  != nil {
			return nil, 
		}
	}
	 = append(, ')')

	if len(.include) > 0 {
		 = append(, " INCLUDE ("...)
		for ,  := range .include {
			if  > 0 {
				 = append(, ", "...)
			}
			,  = .AppendQuery(, )
			if  != nil {
				return nil, 
			}
		}
		 = append(, ')')
	}

	if len(.where) > 0 {
		,  = appendWhere(, , .where)
		if  != nil {
			return nil, 
		}
	}

	return , nil
}

//------------------------------------------------------------------------------

func ( *CreateIndexQuery) ( context.Context,  ...interface{}) (sql.Result, error) {
	,  := .AppendQuery(.db.fmter, .db.makeQueryBytes())
	if  != nil {
		return nil, 
	}

	 := internal.String()

	,  := .exec(, , )
	if  != nil {
		return nil, 
	}

	return , nil
}