package client

import (
	"context"

	"github.com/urfave/cli/v2"
	"golang.org/x/xerrors"

	"github.com/pingcap-inc/security/baseline/internal/network"
	"github.com/pingcap-inc/security/baseline/internal/trivy"
	"github.com/pingcap-inc/security/baseline/pkg/log"
)

func ScanImage(cliCtx *cli.Context) error {
	if err := log.InitLogger(cliCtx.Bool("debug"), cliCtx.Bool("quiet")); err != nil {
		return xerrors.Errorf("failed to initialize a logger: %w", err)
	}

	opt, err := trivy.NewImageOption(cliCtx)
	if err != nil {
		cliCtx.App.Action(cliCtx)

		return xerrors.Errorf("option error: %w", err)
	}

	return trivy.ScanImage(opt)
}

func ScanRepo(cliCtx *cli.Context) error {
	if err := log.InitLogger(cliCtx.Bool("debug"), cliCtx.Bool("quiet")); err != nil {
		return xerrors.Errorf("failed to initialize a logger: %w", err)
	}

	opt, err := trivy.NewRepoOption(cliCtx)
	if err != nil {
		cliCtx.App.Action(cliCtx)

		return xerrors.Errorf("option error: %w", err)
	}

	return trivy.ScanRepo(opt)
}

func ScanNetwork(cliCtx *cli.Context) error {
	if err := log.InitLogger(cliCtx.Bool("debug"), cliCtx.Bool("quiet")); err != nil {
		return xerrors.Errorf("failed to initialize a logger: %w", err)
	}

	opt, err := network.NewNetworkOption(cliCtx)
	if err != nil {
		cliCtx.App.Action(cliCtx)

		return xerrors.Errorf("option error: %w", err)
	}

	_, cancel := context.WithTimeout(cliCtx.Context, opt.Timeout)
	defer cancel()

	return err
}
