package query

import (
	"database/sql"
	"strconv"
	"strings"

	"github.com/nexuscrm/shared/pkg/models"
)

// trimDecimalString removes trailing zeros from DECIMAL(65,30) strings produced by
// MySQL/TiDB when storing Python decimal.Decimal values.
// "0.000000000000000000000000000000" → "0"
// "5.500000000000000000000000000000" → "5.5"
// Non-numeric strings (dates, text) are returned unchanged.
func trimDecimalString(s string) string {
	if !strings.Contains(s, ".") {
		return s
	}
	if _, err := strconv.ParseFloat(s, 64); err != nil {
		return s
	}
	s = strings.TrimRight(s, "0")
	s = strings.TrimRight(s, ".")
	if s == "" || s == "-" {
		return "0"
	}
	return s
}

// ScanRowsToSObjects scans SQL rows into a slice of SObject maps
func ScanRowsToSObjects(rows *sql.Rows) ([]models.SObject, error) {
	columns, err := rows.Columns()
	if err != nil {
		return nil, err
	}

	results := make([]models.SObject, 0)
	for rows.Next() {
		values := make([]interface{}, len(columns))
		valuePtrs := make([]interface{}, len(columns))
		for i := range values {
			valuePtrs[i] = &values[i]
		}

		if err := rows.Scan(valuePtrs...); err != nil {
			return nil, err
		}

		record := make(models.SObject)
		for i, col := range columns {
			val := values[i]
			if b, ok := val.([]byte); ok {
				record[col] = trimDecimalString(string(b))
			} else {
				record[col] = val
			}
		}

		results = append(results, record)
	}

	return results, nil
}
