package orm

import (
	
)

type CreateCompositeOptions struct {
	Varchar int // replaces PostgreSQL data type `text` with `varchar(n)`
}

type CreateCompositeQuery struct {
	q   *Query
	opt *CreateCompositeOptions
}

var (
	_ QueryAppender = (*CreateCompositeQuery)(nil)
	_ QueryCommand  = (*CreateCompositeQuery)(nil)
)

func ( *Query,  *CreateCompositeOptions) *CreateCompositeQuery {
	return &CreateCompositeQuery{
		q:   ,
		opt: ,
	}
}

func ( *CreateCompositeQuery) () string {
	,  := .AppendQuery(defaultFmter, nil)
	if  != nil {
		panic()
	}
	return string()
}

func ( *CreateCompositeQuery) () QueryOp {
	return CreateCompositeOp
}

func ( *CreateCompositeQuery) () QueryCommand {
	return &CreateCompositeQuery{
		q:   .q.Clone(),
		opt: .opt,
	}
}

func ( *CreateCompositeQuery) () *Query {
	return .q
}

func ( *CreateCompositeQuery) ( []byte) ([]byte, error) {
	return .AppendQuery(dummyFormatter{}, )
}

func ( *CreateCompositeQuery) ( QueryFormatter,  []byte) ([]byte, error) {
	if .q.stickyErr != nil {
		return nil, .q.stickyErr
	}
	if .q.tableModel == nil {
		return nil, errModelNil
	}

	 := .q.tableModel.Table()

	 = append(, "CREATE TYPE "...)
	 = append(, .Alias...)
	 = append(, " AS ("...)

	for ,  := range .Fields {
		if  > 0 {
			 = append(, ", "...)
		}

		 = append(, .Column...)
		 = append(, " "...)
		if .UserSQLType == "" && .opt != nil && .opt.Varchar > 0 &&
			.SQLType == "text" {
			 = append(, "varchar("...)
			 = strconv.AppendInt(, int64(.opt.Varchar), 10)
			 = append(, ")"...)
		} else {
			 = append(, .SQLType...)
		}
	}

	 = append(, ")"...)

	return , .q.stickyErr
}