package executor

import "github.com/everything-on-mysql/cassandra-on-mysql/pkg/cql/parser"

func (e *Executor) preparedCacheEligible(prepared *PreparedStatement, stmt parser.Statement, paging *PagingOptions) bool {
	if e == nil || !e.preparedCache.enabled || e.poolManager == nil {
		return false
	}
	if prepared == nil || stmt == nil {
		return false
	}
	if prepared.IsSpecialQuery || prepared.IsSetKeyspace {
		return false
	}
	if paging != nil && (paging.PageSize > 0 || len(paging.PagingState) > 0) {
		return false
	}
	switch s := stmt.(type) {
	case *parser.SelectStatement:
		return true
	case *parser.InsertStatement:
		if s.JSON || s.IfNotExists {
			return false
		}
		return true
	case *parser.UpdateStatement:
		if s.IfExists || s.IfCondition != nil {
			return false
		}
		for _, assignment := range s.Assigments {
			if assignment == nil {
				continue
			}
			if assignment.Op != "" && assignment.Op != "=" {
				return false
			}
			if _, ok := assignment.Target.(*parser.CollectionAccessExpr); ok {
				return false
			}
			if exprHasColumnRef(assignment.Value) {
				return false
			}
		}
		return true
	case *parser.DeleteStatement:
		if s.IfExists || s.IfCondition != nil {
			return false
		}
		if len(deleteAssignments(s)) > 0 {
			return false
		}
		return true
	default:
		return false
	}
}
