/*
 * Copyright 2026 Oleg Borodin <onborodin@gmail.com>
 */
package gcrcli

import (
	"context"
	"os"

	"mstore/pkg/auxtool"
	"mstore/pkg/auxutar"

	"github.com/google/go-containerregistry/pkg/authn"
	"github.com/google/go-containerregistry/pkg/crane"
	"github.com/google/go-containerregistry/pkg/name"
	"github.com/google/go-containerregistry/pkg/v1/remote/transport"
)

func (cli *Client) PullImage(ctx context.Context, imagepath, filepath string) error {
	var err error

	imagepath, username, password, err := repackReference(imagepath)
	if err != nil {
		return err
	}

	options := make([]crane.Option, 0)
	options = append(options, crane.WithContext(ctx))

	if username != "" && password != "" {
		ref, err := name.ParseReference(imagepath)
		if err != nil {
			return err
		}
		repo := ref.Context()
		if err != nil {
			return err
		}
		defaultTransport := NewRoundTripper(cli.skipTLSVerify)

		scopes := []string{repo.Scope(transport.PullScope)}

		regName := repo.RegistryStr()
		reg, err := name.NewRegistry(regName)
		if err != nil {
			return err
		}
		basicAuth := &authn.Basic{
			Username: username,
			Password: password,
		}
		authTransport, err := transport.NewWithContext(ctx, reg, basicAuth, defaultTransport, scopes)
		if err != nil {
			return err
		}
		options = append(options, crane.WithTransport(authTransport))
	} else {
		transport := NewRoundTripper(cli.skipTLSVerify)
		options = append(options, crane.WithTransport(transport))
	}

	image, err := crane.Pull(imagepath, options...)
	if err != nil {
		return err
	}
	dstdir := auxtool.MakeTmpFilename(filepath)
	err = os.MkdirAll(dstdir, 0750)
	if err != nil {
		return err
	}
	err = crane.SaveOCI(image, dstdir)
	if err != nil {
		return err
	}
	err = auxutar.Archive(dstdir, filepath)
	if err != nil {
		return err
	}
	err = os.RemoveAll(dstdir)
	if err != nil {
		return err
	}
	return err
}
