package http

import (
	"fmt"

	storev1pb "code.tvl.fyi/tvix/store-go"
	mh "github.com/multiformats/go-multihash/core"
	nixhash "github.com/nix-community/go-nix/pkg/hash"

	"github.com/nix-community/go-nix/pkg/narinfo"
	"github.com/nix-community/go-nix/pkg/narinfo/signature"
	"github.com/nix-community/go-nix/pkg/nixbase32"
)

// ToNixNarInfo converts the PathInfo to a narinfo.NarInfo.
func ToNixNarInfo(p *storev1pb.PathInfo) (*narinfo.NarInfo, error) {
	// ensure the PathInfo is valid, and extract the StorePath from the node in
	// there.
	storePath, err := p.Validate()
	if err != nil {
		return nil, fmt.Errorf("failed to validate PathInfo: %w", err)
	}

	// convert the signatures from storev1pb signatures to narinfo signatures
	narinfoSignatures := make([]signature.Signature, len(p.GetNarinfo().GetSignatures()))
	for i, pathInfoSignature := range p.GetNarinfo().GetSignatures() {
		narinfoSignatures[i] = signature.Signature{
			Name: pathInfoSignature.GetName(),
			Data: pathInfoSignature.GetData(),
		}
	}

	// produce nixhash for the narsha256.
	narHash, err := nixhash.FromHashTypeAndDigest(
		mh.SHA2_256,
		p.GetNarinfo().GetNarSha256(),
	)
	if err != nil {
		return nil, fmt.Errorf("invalid narsha256: %w", err)
	}

	return &narinfo.NarInfo{
		StorePath:   storePath.Absolute(),
		URL:         "nar/" + nixbase32.EncodeToString(narHash.Digest()) + ".nar",
		Compression: "none",
		NarHash:     narHash,
		NarSize:     uint64(p.GetNarinfo().GetNarSize()),
		References:  p.GetNarinfo().GetReferenceNames(),
		Signatures:  narinfoSignatures,
	}, nil
}
