package cmd

import (
	"fmt"
	"io/ioutil"
	"log"
	"os"

	"github.com/spf13/cobra"
	"github.com/volker-raschek/docker-hub-description-updater/pkg/hub"
	"github.com/volker-raschek/docker-hub-description-updater/pkg/types"
)

var (
	dockerHubNamespace  string
	dockerHubUser       string
	dockerHubPassword   string
	dockerHubRepository string
)

// Execute a
func Execute(version string) {
	rootCmd := &cobra.Command{
		Use:     "dhdu",
		Short:   "docker hub description updater (dhdu)",
		RunE:    runE,
		Args:    cobra.ExactArgs(1),
		Version: version,
	}
	rootCmd.Flags().StringVarP(&dockerHubNamespace, "namespace", "n", "", "Docker Hub Namespace (default \"username\")")
	rootCmd.Flags().StringVarP(&dockerHubPassword, "password", "p", "", "Docker Hub Password")
	rootCmd.Flags().StringVarP(&dockerHubRepository, "repository", "r", "", "Docker Hub Repository")
	rootCmd.Flags().StringVarP(&dockerHubUser, "username", "u", "", "Docker Hub Username")
	rootCmd.Execute()
}

func runE(cmd *cobra.Command, args []string) error {

	file := args[0]

	if len(dockerHubUser) <= 0 {
		return fmt.Errorf("No user defined over flags")
	}

	if len(dockerHubPassword) <= 0 {
		return fmt.Errorf("No password defined over flags")
	}

	if len(dockerHubNamespace) <= 0 {
		log.Printf("No namespace defined over flags: Use docker username %v instead", dockerHubUser)
		dockerHubNamespace = dockerHubUser
	}

	if len(dockerHubRepository) <= 0 {
		return fmt.Errorf("No repository defined over flags")
	}

	if _, err := os.Stat(file); os.IsNotExist(err) && len(file) <= 0 {
		return fmt.Errorf("Can not find file: %v", file)
	}

	f, err := ioutil.ReadFile(file)
	if err != nil {
		return fmt.Errorf("Can not read file %v: %v", file, err)
	}
	fullDescription := string(f)

	loginCredentials := &types.LoginCredentials{
		User:     dockerHubUser,
		Password: dockerHubPassword,
	}

	h := hub.New(loginCredentials)

	repository := &types.Repository{
		Name:            dockerHubRepository,
		Namespcace:      dockerHubNamespace,
		FullDescription: fullDescription,
	}

	_, err = h.PatchRepository(repository)
	if err != nil {
		return err
	}

	return nil
}