package main

import (
	"archive/tar"
	"bytes"
	"compress/gzip"
	"fmt"
	"io"
	"os"
	"path/filepath"
	"runtime"
	"strings"

	"github.com/zhyee/zipstream"
)

type JavaManager struct {
	app	*App
}

func (JavaManager)CheckJavaVer(version int) bool{
	suffix := "lin"
	if runtime.GOOS == "windows" {
		suffix = "win"
	}
	path, _ := os.UserConfigDir()
	path = filepath.Join(path, "FCLauncher", "java", fmt.Sprintf("java-%d-%s", version, suffix))

	_, err := os.Stat(path)
	if err == nil {
		return true
	}
	return false

}

func (j *JavaManager)InstallJavaVer(version int) {
	suffix := "lin.tar.gz"
	if runtime.GOOS == "windows" {
		suffix = "win.zip"
	}
	buff := new(bytes.Buffer)
	HttpDownload("java/"+fmt.Sprintf("java-%d-%s", version, suffix), buff, j.app.Ctx)
	path, _ := os.UserConfigDir()
	suffix = "lin"
	if runtime.GOOS == "windows" {
		suffix = "win"
	}

	path = filepath.Join(path, "FCLauncher", "java", fmt.Sprintf("java-%d-%s", version, suffix))
	os.MkdirAll(path, 0755)
	if runtime.GOOS == "windows" {
		zr := zipstream.NewReader(buff)	
		for {
			entry, err := zr.GetNextEntry()
			if err == io.EOF {
				break
			}
			if err != nil {
				return
			}
			target := filepath.Join(path, strings.SplitN(entry.Name, "/", 2)[1])
			if !entry.IsDir() {
				rc, err := entry.Open()
				if err != nil {
					return
				}
				f, err := os.OpenFile(target, os.O_CREATE|os.O_RDWR, entry.FileInfo().Mode())
				if err != nil {
					return
				}
				if _, err := io.Copy(f, rc); err != nil {
					return
				}
				f.Close()
				rc.Close()
			} else {
				if _, err := os.Stat(target); err != nil {
					if err := os.MkdirAll(target, 0755); err != nil {
						return
					}
				}
			}
		}
	} else {
		gzip, _ := gzip.NewReader(buff)
		defer gzip.Close()
		tr := tar.NewReader(gzip)
	out:
		for {
			header, err := tr.Next()
			switch {
			case err == io.EOF:
				break out
			case err != nil:
				return
			case header == nil:
				continue
			}
			target := filepath.Join(path, strings.SplitN(header.Name, string(os.PathSeparator), 2)[1])
			switch header.Typeflag {
			case tar.TypeDir:
				if _, err := os.Stat(target); err != nil {
					if err := os.MkdirAll(target, 0755); err != nil {
						return
					}
				}
			case tar.TypeReg:
				f, err := os.OpenFile(target, os.O_CREATE|os.O_RDWR, os.FileMode(header.Mode))
				if err != nil {
					return
				}
				if _, err := io.Copy(f, tr); err != nil {
					return
				}
				f.Close()
			}
		}
	}
}
