import distutils.dir_util  # for copying trees
import os  # for env vars
import stat  # for file stats
import subprocess  # do stuff at the shell level
from shutil import copy, make_archive, move, rmtree  # file manipulation

import common
from git_clean import git_clean

env = common.prepare_env() # get env vars

dirs = [
  os.path.join("..", "artifact"), # temp dir for binary
  os.path.join("..", "build"),    # temp dir for other stuff
  os.path.join("..", "deploy")    # dir for archive
]
for dirname in dirs:
  if not os.path.isdir(dirname):
    os.makedirs(dirname)

# make dirs for each os
for dirname in ["linux","macos","windows"]:
  if not os.path.isdir(os.path.join("..","deploy",dirname)):
  	os.mkdir(os.path.join("..","deploy",dirname))

# sanity check permissions for working_dirs.json
dirpath = "."
for dirname in ["resources","user","meta","manifests"]:
	dirpath += os.path.join(dirpath,dirname)
	if os.path.isdir(dirpath):
		os.chmod(dirpath,0o755)

# nuke git files
for git in [ os.path.join(".", ".gitattrubutes"), os.path.join(".", ".gitignore") ]:
  if os.path.isfile(git):
    os.remove(git)

# nuke travis file if it exists
for travis in [ os.path.join(".", ".travis.yml"), os.path.join(".", ".travis.off") ]:
  if os.path.isfile(travis):
    os.remove(travis)

# nuke test suite if it exists
if os.path.isdir(os.path.join(".","tests")):
  distutils.dir_util.remove_tree(os.path.join(".","tests"))

BUILD_FILENAME = ""
ZIP_FILENAME = ""

# list executables
BUILD_FILENAME = common.find_binary(os.path.join("."))
if BUILD_FILENAME == "":
  BUILD_FILENAME = common.find_binary(os.path.join("..","artifact"))

if isinstance(BUILD_FILENAME,str):
  BUILD_FILENAME = list(BUILD_FILENAME)

BUILD_FILENAMES = BUILD_FILENAME

print(BUILD_FILENAMES)

if len(BUILD_FILENAMES) > 0:
  for BUILD_FILENAME in BUILD_FILENAMES:
    if not BUILD_FILENAME == "":
      if not "artifact" in BUILD_FILENAME:
        # move the binary to temp folder
        move(
          os.path.join(".",BUILD_FILENAME),
          os.path.join("..","artifact",BUILD_FILENAME)
        )

  # clean the git slate
  git_clean()

  # mv dirs from source code
  dirs = [
    os.path.join(".",".git"),
    os.path.join(".",".github"),
    os.path.join(".",".gitignore"),
    os.path.join(".","html"),
    os.path.join(".","resources","ci")
  ]
  for dirname in dirs:
    if os.path.isdir(dirname):
      move(
        dirname,
        os.path.join("..", "build", dirname)
      )

  for BUILD_FILENAME in BUILD_FILENAMES:
    if not "artifact" in BUILD_FILENAME:
      if os.path.isfile(os.path.join("..","artifact",BUILD_FILENAME)):
      	# move the binary back
      	move(
          os.path.join("..","artifact",BUILD_FILENAME),
      		os.path.join(".",BUILD_FILENAME)
      	)
      	# Make Linux/Mac binary executable
      	if "linux" in env["OS_NAME"] or "ubuntu" in env["OS_NAME"] or "mac" in env["OS_NAME"] or "osx" in env["OS_NAME"]:
      		os.chmod(os.path.join(".",BUILD_FILENAME),0o755)

  # .zip if windows
  # .tar.gz otherwise
  if len(BUILD_FILENAMES) > 1:
    # ZIP_FILENAME = os.path.join("..","deploy",env["REPO_NAME"])
    ZIP_FILENAME = os.path.join("..","deploy","ALttPOverworldRandomizer")
  else:
    ZIP_FILENAME = os.path.join("..","deploy",os.path.splitext(BUILD_FILENAME)[0])
  if env["OS_NAME"] == "windows":
    make_archive(ZIP_FILENAME,"zip")
    ZIP_FILENAME += ".zip"
  else:
    make_archive(ZIP_FILENAME,"gztar")
    ZIP_FILENAME += ".tar.gz"

  # mv dirs back
  for dir in dirs:
    if os.path.isdir(os.path.join("..","build",dir)):
      move(
        os.path.join("..","build",dir),
        os.path.join(".",dir)
      )

for BUILD_FILENAME in BUILD_FILENAMES:
  if not BUILD_FILENAME == "":
    print("Build Filename: " + BUILD_FILENAME)
    print("Build Filesize: " + common.file_size(BUILD_FILENAME))
  else:
    print("🟡No Build to prepare: " + BUILD_FILENAME)

if not ZIP_FILENAME == "":
  print("Zip Filename:   " + ZIP_FILENAME)
  print("Zip Filesize:   " + common.file_size(ZIP_FILENAME))
else:
  print("🟡No Zip to prepare: " + ZIP_FILENAME)

print("App Version:    " + env["GITHUB_TAG"])

if (len(BUILD_FILENAMES) == 0) or (ZIP_FILENAME == ""):
  exit(1)
