package cmd

import (
	"lon-tool/utils"
	"os"

	"github.com/pterm/pterm"
	"github.com/spf13/cobra"
	"github.com/timoxa0/gofastboot/fastboot"
)

var uninstallCmd = &cobra.Command{
	Use:   "uninstall",
	Short: "Restore stock GPT",
	Long:  "Restore stock partition table",
	Args:  cobra.ExactArgs(0),
	Run: func(cmd *cobra.Command, args []string) {
		fb_devs, err := fastboot.FindDevices()
		if err != nil {
			logger.Fatal("Failed to get fastboot device", logger.Args(err))
		}

		if len(fb_devs) < 1 {
			logger.Fatal("No fastboot devices found")
			os.Exit(170)
		}

		if serail == "autodetect" {
			for _, dev := range fb_devs {
				product, err := dev.GetVar("product")
				devSerial, _ := dev.Device.SerialNumber()
				if err != nil {
					logger.Warn("Unable to communicate with device", logger.Args("Serial", devSerial))
					continue
				}
				logger.Debug("Found device", logger.Args("Product", product, "Sraial", devSerial))
				if product == "nabu" {
					logger.Debug("Nabu found", logger.Args("Serial", devSerial))
					serail = devSerial
					break
				}
			}
			for _, dev := range fb_devs {
				dev.Close()
			}
			if serail == "autodetect" {
				logger.Fatal("Nabu in fastboot mode not found")
				os.Exit(170)
			}
		}

		repartition, _ := pterm.DefaultInteractiveConfirm.Show("All user data will be ERASED. Continue?")
		if !repartition {
			logger.Info("Bye")
			os.Exit(253)
		}

		fb_dev, _ := fastboot.FindDevice(serail)

		gpt, err := utils.Files.GPT.Get(*pbar.WithTitle("Downloading default partition table"))
		if err != nil {
			if gpt != nil {
				logger.Warn("Unable to verify gpt image")
			} else {
				logger.Error("Unable to download gpt image")
				os.Exit(179)
			}
		}

		userdata, err := utils.Files.CleanUserdata.Get(*pbar.WithTitle("Downloading empty userdata"))
		if err != nil {
			if userdata != nil {
				logger.Warn("Unable to verify userdata image")
			} else {
				logger.Error("Unable to download userdata image")
				os.Exit(179)
			}
		}

		if e := fb_dev.Flash("partition:0", gpt); e != nil {
			logger.Error("Failed to flash GPT. Reflash stock rom and try again")
			logger.Debug("Error", logger.Args("e", e))
			os.Exit(180)
		}

		if e := fb_dev.Flash("userdata", userdata); e != nil {
			logger.Error("Failed to clean userdata. Reflash stock rom and try again")
			logger.Debug("Error", logger.Args("e", e))
			os.Exit(180)
		}
		logger.Info("Done! Reflash stock rom to remove uefi")
	},
}

func init() {
	rootCmd.AddCommand(uninstallCmd)
	uninstallCmd.Flags().StringVarP(&serail, "serial", "s", "autodetect", "Device serial")
}