package runner

import (
	"bufio"
	"fmt"
	"net/url"
	"os"
	"strings"

	"github.com/projectdiscovery/nuclei/v3/pkg/types"
	"github.com/projectdiscovery/utils/errkit"
	fileutil "github.com/projectdiscovery/utils/file"
	proxyutils "github.com/projectdiscovery/utils/proxy"
)

const (
	HTTP_PROXY_ENV = "HTTP_PROXY"
)

// loadProxyServers load list of proxy servers from file or comma separated
func loadProxyServers(options *types.Options) error {
	if len(options.Proxy) == 0 {
		return nil
	}
	proxyList := []string{}
	for _, p := range options.Proxy {
		if fileutil.FileExists(p) {
			file, err := os.Open(p)
			if err != nil {
				return fmt.Errorf("could not open proxy file: %w", err)
			}
			defer func() {
				_ = file.Close()
			}()
			scanner := bufio.NewScanner(file)
			for scanner.Scan() {
				proxy := scanner.Text()
				if strings.TrimSpace(proxy) == "" {
					continue
				}
				proxyList = append(proxyList, proxy)
			}
		} else {
			proxyList = append(proxyList, p)
		}
	}
	aliveProxy, err := proxyutils.GetAnyAliveProxy(options.Timeout, proxyList...)
	if err != nil {
		return err
	}
	proxyURL, err := url.Parse(aliveProxy)
	if err != nil {
		return errkit.Wrapf(err, "failed to parse proxy got %v", err)
	}
	if options.ProxyInternal {
		_ = os.Setenv(HTTP_PROXY_ENV, proxyURL.String())
	}
	switch proxyURL.Scheme {
	case proxyutils.HTTP, proxyutils.HTTPS:
		options.Logger.Verbose().Msgf("Using %s as proxy server", proxyURL.String())
		options.AliveHttpProxy = proxyURL.String()
	case proxyutils.SOCKS5:
		options.AliveSocksProxy = proxyURL.String()
		options.Logger.Verbose().Msgf("Using %s as socket proxy server", proxyURL.String())
	}
	return nil
}
