package helpers

import (
	"archive/tar"
	"archive/zip"
	"compress/bzip2"
	"compress/gzip"
	"io"
	"sort"
)

type ReadSeekerAt interface {
	io.Reader
	io.Seeker
	io.ReaderAt
}

func ListArchiveFiles(mimetype string, size int64, r ReadSeekerAt) (files []string, err error) {
	if mimetype == "application/x-tar" {
		tReadr := tar.NewReader(r)
		for {
			hdr, err := tReadr.Next()
			if err == io.EOF || err != nil {
				break
			}
			if hdr.Typeflag == tar.TypeDir || hdr.Typeflag == tar.TypeReg {
				files = append(files, hdr.Name)
			}
		}
		sort.Strings(files)
	} else if mimetype == "application/x-gzip" {
		gzf, err := gzip.NewReader(r)
		if err == nil {
			tReadr := tar.NewReader(gzf)
			for {
				hdr, err := tReadr.Next()
				if err == io.EOF || err != nil {
					break
				}
				if hdr.Typeflag == tar.TypeDir || hdr.Typeflag == tar.TypeReg {
					files = append(files, hdr.Name)
				}
			}
			sort.Strings(files)
		}
	} else if mimetype == "application/x-bzip" {
		bzf := bzip2.NewReader(r)
		tReadr := tar.NewReader(bzf)
		for {
			hdr, err := tReadr.Next()
			if err == io.EOF || err != nil {
				break
			}
			if hdr.Typeflag == tar.TypeDir || hdr.Typeflag == tar.TypeReg {
				files = append(files, hdr.Name)
			}
		}
		sort.Strings(files)
	} else if mimetype == "application/zip" {
		zf, err := zip.NewReader(r, size)
		if err == nil {
			for _, f := range zf.File {
				files = append(files, f.Name)
			}
		}
		sort.Strings(files)
	}

	return
}