// Clean the left over test files

package main

import (
	"context"
	"log"
	"regexp"

	"github.com/pkg/errors"
	"github.com/rclone/rclone/fs"
	"github.com/rclone/rclone/fs/list"
	"github.com/rclone/rclone/fs/operations"
)

// MatchTestRemote matches the remote names used for testing (copied
// from fstest/fstest.go so we don't have to import that and get all
// its flags)
var MatchTestRemote = regexp.MustCompile(`^rclone-test-[abcdefghijklmnopqrstuvwxyz0123456789]{24}(_segments)?$`)

// cleanFs runs a single clean fs for left over directories
func cleanFs(remote string) error {
	f, err := fs.NewFs(remote)
	if err != nil {
		return err
	}
	entries, err := list.DirSorted(context.Background(), f, true, "")
	if err != nil {
		return err
	}
	var lastErr error
	err = entries.ForDirError(func(dir fs.Directory) error {
		dirPath := dir.Remote()
		fullPath := remote + dirPath
		if MatchTestRemote.MatchString(dirPath) {
			if *dryRun {
				log.Printf("Not Purging %s - -dry-run", fullPath)
				return nil
			}
			log.Printf("Purging %s", fullPath)
			dir, err := fs.NewFs(fullPath)
			if err != nil {
				err = errors.Wrap(err, "NewFs failed")
				lastErr = err
				fs.Errorf(fullPath, "%v", err)
				return nil
			}
			err = operations.Purge(context.Background(), dir, "")
			if err != nil {
				err = errors.Wrap(err, "Purge failed")
				lastErr = err
				fs.Errorf(dir, "%v", err)
				return nil
			}
		}
		return nil
	})
	if err != nil {
		return err
	}
	return lastErr
}

// cleanRemotes cleans the list of remotes passed in
func cleanRemotes(remotes []string) error {
	var lastError error
	for _, remote := range remotes {
		log.Printf("%q - Cleaning", remote)
		err := cleanFs(remote)
		if err != nil {
			lastError = err
			log.Printf("Failed to purge %q: %v", remote, err)
		}
	}
	return lastError
}