package main

import (
	"flag"
	"fmt"
	"os"
	"syscall"

	"golang.org/x/crypto/ssh/terminal"

	"gitlab.com/tovijaeschke/FileEncryption/Encryption"
)

func getPassword() (string, error) {
	var (
		bytePassword []byte
		e            error
	)
	fmt.Print("Enter Password: ")
	bytePassword, e = terminal.ReadPassword(int(syscall.Stdin))
	if e != nil {
		return "", e
	}
	return string(bytePassword), nil
}

func main() {
	var (
		files   []string
		decrypt *bool
		read    *bool
		edit    *bool

		plaintext string
		password  string
		e         error
	)

	flag.Usage = func() {
		fmt.Fprintf(flag.CommandLine.Output(), "Usage: %s [OPTIONS]... [FILES]...\n", os.Args[0])
		fmt.Println("\t-d: Decrypt files")
		fmt.Println("\t-r: Decrypt and read files to stdout")
		fmt.Println("\t-e: Edit encrypted file")
	}

	decrypt = flag.Bool("d", false, "Decrypt the file(s)")
	read = flag.Bool("r", false, "Read file to stdout")
	edit = flag.Bool("e", false, "Edit encrypted file")
	flag.Parse()
	files = flag.Args()

	if len(files) == 0 {
		flag.Usage()
		fmt.Println("Files cannot be null")
		os.Exit(1)
	}

	password, e = getPassword()
	if e != nil {
		fmt.Println(e.Error())
		os.Exit(1)
	}

	if *decrypt {
		for _, file := range files {
			e = Encryption.DecryptFile(password, file)
			if e != nil {
				fmt.Println(e.Error())
				os.Exit(1)
			}
		}
		os.Exit(0)
	}

	if *read {
		for _, file := range files {
			plaintext, e = Encryption.DecryptAndReadFile(password, file)
			if e != nil {
				fmt.Println(e.Error())
				os.Exit(1)
			}
			fmt.Println(file)
			fmt.Println(plaintext)
		}
		os.Exit(0)
	}

	if *edit {
		for _, file := range files {
			e = Encryption.EditEncryptedFile(password, file)
			if e != nil {
				fmt.Println(e.Error())
				os.Exit(1)
			}
		}
		os.Exit(0)
	}


	for _, file := range files {
		e = Encryption.EncryptFile(password, file)
		if e != nil {
			fmt.Println(e.Error())
			os.Exit(1)
		}
	}
}
