package main

import (
	"flag"
	"fmt"
	"os"
)

func main() {
	
	//'videos get' subcommand
  getCmd := flag.NewFlagSet("get", flag.ExitOnError)

	// inputs for `videos get` command
  getAll := getCmd.Bool("all", false, "Get all videos")
  getID := getCmd.String("id", "", "YouTube video ID")

	//'videos add' subcommand
	addCmd := flag.NewFlagSet("add", flag.ExitOnError)

	// inputs for `videos add` command
	addID := addCmd.String("id", "", "YouTube video ID")
  addTitle := addCmd.String("title", "", "YouTube video Title")
  addUrl := addCmd.String("url", "", "YouTube video URL")
  addImageUrl := addCmd.String("imageurl", "", "YouTube video Image URL")
  addDesc := addCmd.String("desc", "", "YouTube video description")

	if len(os.Args) < 2 {
		fmt.Println("expected 'get' or 'add' subcommands")
		os.Exit(1)
  }

	//look at the 2nd argument's value
	switch os.Args[1] {
		case "get": // if its the 'get' command
			HandleGet(getCmd, getAll, getID)
		case "add": // if its the 'add' command
			HandleAdd(addCmd, addID,addTitle,addUrl, addImageUrl, addDesc)
		default: // if we don't understand the input
	}


}

func HandleGet(getCmd *flag.FlagSet, all *bool, id *string){

	getCmd.Parse(os.Args[2:])

	if *all == false && *id == "" {
    fmt.Print("id is required or specify --all for all videos")
    getCmd.PrintDefaults()
    os.Exit(1)
  }

	if *all {
		//return all videos
		videos := getVideos()
		
		fmt.Printf("ID \t Title \t URL \t ImageURL \t Description \n")
		for _, video := range videos {
			fmt.Printf("%v \t %v \t %v \t %v \t %v \n",video.Id, video.Title, video.Url, video.Imageurl,video.Description)
		}

		return
	}

	if *id != "" {
		videos := getVideos()
		id := *id
		for _, video := range videos {
			if id == video.Id {
				fmt.Printf("ID \t Title \t URL \t ImageURL \t Description \n")
				fmt.Printf("%v \t %v \t %v \t %v \t %v \n",video.Id, video.Title, video.Url, video.Imageurl,video.Description)
			}
		}
	} 



}

func ValidateVideo(addCmd *flag.FlagSet,id *string, title *string, url *string, imageUrl *string, description *string ){

	addCmd.Parse(os.Args[2:])

	if *id == "" || *title == "" || *url == "" || *imageUrl == "" || *description == "" {
		fmt.Print("all fields are required for adding a video")
		addCmd.PrintDefaults()
		os.Exit(1)
	}

}

func HandleAdd(addCmd *flag.FlagSet,id *string, title *string, url *string, imageUrl *string, description *string ){

	ValidateVideo(addCmd, id,title,url, imageUrl, description)

	video := video{
		Id: *id,
		Title: *title,
		Description: *description,
		Imageurl: *imageUrl, 
		Url: *url, 
	}

	videos := getVideos()
	videos = append(videos,video)

	saveVideos(videos)

}