// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package query_functions

import (
	"v.io/syncbase/v23/syncbase/nosql/internal/query/conversions"
	"v.io/syncbase/v23/syncbase/nosql/internal/query/query_parser"
	"v.io/syncbase/v23/syncbase/nosql/query_db"
	"v.io/syncbase/v23/syncbase/nosql/syncql"
)

func complexFunc(off int64, args []*query_parser.Operand) (*query_parser.Operand, error) {
	r, err := conversions.ConvertValueToFloat(args[0])
	if err != nil {
		return nil, err
	}

	i, err := conversions.ConvertValueToFloat(args[1])
	if err != nil {
		return nil, err
	}

	return makeComplexOp(off, complex(r.Float, i.Float)), nil
}

func twoFloatsArgsCheck(db query_db.Database, off int64, args []*query_parser.Operand) error {
	// The two args must be convertable to floats.
	for i := 0; i < 2; i++ {
		if err := checkIfPossibleThatArgIsConvertableToFloat(args[i]); err != nil {
			return syncql.NewErrFloatConversionError(db.GetContext(), args[i].Off, err)
		}
	}
	return nil
}

// If possible, check if arg is convertable to a float.  Fields and not yet computed
// functions cannot be checked and will just return nil.
func checkIfPossibleThatArgIsConvertableToFloat(arg *query_parser.Operand) error {
	// If arg is a literal or an already computed function,
	// make sure it can be converted to a float.
	switch arg.Type {
	case query_parser.TypBigInt, query_parser.TypBigRat, query_parser.TypBool, query_parser.TypComplex, query_parser.TypFloat, query_parser.TypInt, query_parser.TypStr, query_parser.TypTime, query_parser.TypUint:
		_, err := conversions.ConvertValueToFloat(arg)
		return err
	case query_parser.TypFunction:
		if arg.Function.Computed {
			_, err := conversions.ConvertValueToFloat(arg.Function.RetValue)
			return err
		}
	}
	return nil
}
