package banco

import (
	"errors"
	"strings"
	"time"

	"github.com/go-sql-driver/mysql"
)

func EhRetentavel(err error) bool {
	if err == nil {
		return false
	}
	msg := strings.ToLower(err.Error())
	if strings.Contains(msg, "deadlock") ||
		strings.Contains(msg, "lock wait timeout") ||
		strings.Contains(msg, "try restarting transaction") ||
		strings.Contains(msg, "gone away") ||
		strings.Contains(msg, "lost connection") {
		return true
	}
	var me *mysql.MySQLError
	if errors.As(err, &me) {
		switch me.Number {
		case 1205, 1213, 2006, 2013:
			return true
		}
	}
	return false
}

func Retentar(max int, fn func() error) error {
	var last error
	for tentativa := 1; tentativa <= max; tentativa++ {
		last = fn()
		if last == nil {
			return nil
		}
		if !EhRetentavel(last) {
			return last
		}
		if tentativa < max {
			time.Sleep(time.Duration(tentativa*tentativa) * time.Second)
		}
	}
	return last
}
