//go:build !windows

package upgrade

import (
	"fmt"
	"os"
	"path/filepath"
	"syscall"
)

func acquireUpgradeLock(configDir string) (*os.File, error) {
	lockPath := filepath.Join(configDir, "upgrades", "upgrade.lock")
	if err := os.MkdirAll(filepath.Dir(lockPath), 0700); err != nil {
		return nil, fmt.Errorf("create upgrade lock directory: %w", err)
	}
	lock, err := os.OpenFile(lockPath, os.O_CREATE|os.O_RDWR, 0600)
	if err != nil {
		return nil, fmt.Errorf("open upgrade lock: %w", err)
	}
	if err := syscall.Flock(int(lock.Fd()), syscall.LOCK_EX|syscall.LOCK_NB); err != nil {
		lock.Close()
		return nil, fmt.Errorf("another AgentTeam upgrade is already running: %w", err)
	}
	return lock, nil
}
