package main

import (
  "compress/gzip"

  "fmt"
  "io"
  "log"
  "os"
  "path/filepath"
)

func filterOut(path, ext string, minSize int64, info os.FileInfo) bool {
  if info.IsDir() || info.Size() < minSize {
    return true
  }

  if ext != "" && filepath.Ext(path) != ext {
    return true
  }
  return false
}

func listFile(path string, out io.Writer) error {
  _, err := fmt.Fprintln(out, path)
  return err
}

func delFile(path string, delLogger *log.Logger) error {
  if err := os.Remove(path); err != nil {
    return err
  }

  delLogger.Println(path)
  return nil
}

func archiveFile(destDir, root, path string) error {
  info, err := os.Stat(destDir)
  if err != nil {
    return err
  }

  if !info.IsDir() {
    return fmt.Errorf("%s is not a directory", destDir)
  }

  relDir, err := filepath.Rel(root, filepath.Dir(path))
  if err != nil {
    return err
  }

  dest := fmt.Sprintf("%s.gz", filepath.Base(path))
  targetPath := filepath.Join(destDir, relDir, dest)

  if err := os.MkdirAll(filepath.Dir(targetPath), 0755); err != nil {
    return err
  }

  out, err := os.OpenFile(targetPath, os.O_RDWR|os.O_CREATE, 0644)
  if err != nil {
    return err
  }
  defer out.Close()

  in, err := os.Open(path)
  if err != nil {
    return err
  }
  defer in.Close()

  zw := gzip.NewWriter(out)

  zw.Name = filepath.Base(path)

  if _, err = io.Copy(zw, in); err != nil {
    return err
  }

  if err := zw.Close(); err != nil {
    return err
  }

  return out.Close()
}
