#!/usr/bin/env bash

fetch_md5()
{
  md5=$(curl -B "${releases_url}/bdsm-${version}.tar.gz.md5" 2>/dev/null)
}

md5_match()
{
  local archive="$1"

  case "$(uname)" in
    Darwin|FreeBSD)
      archive_md5="$(/sbin/md5 -q "${archive}")"
      ;;

    OpenBSD)
      archive_md5="$(/bin/md5 -q "${archive}")"
      ;;

    Linux|*)
      archive_md5="$(md5sum "${archive}" | awk '{print $1}')"
      ;;
  esac

  if [[ "$archive_md5" == "$md5" ]]
  then
    return 0
  else
    return 1
  fi
}

#
# Package given extension.
#
package_extension()
{
  local sha1="" version _path

  for _path in $(extensions_search_paths)
  do
    if path_exists "${_path}/${extension}"
    then
      extension_path="${_path}/${extension}"
      break
    fi
  done

  if !read -r version < "$extension_path/VERSION"
  then
    fail "${extension_path}/VERSION file is missing. Halting packaging."
  fi

  # TODO: add a sanity check to ensure that VERSION matches x.y.x

  true ${releases_path:="${source_path}/bdsm-extensions/releases"}

  true \
    ${release_name:="${extension}-${version}"} \
    ${release_path:="${releases_path}/${release_name}"} \
    ${remote:=origin} \
    ${branch:=master}

  ensure_paths_exist "$releases_path/" "$release_path/"

  enter "${extension_path}"

  if [[ -d ".git" ]]
  then
    sha1=$(git log -n 1 | head -1 | awk '{print $2}')

    # Tag & push
    git tag "${version}"
    git push "${remote}" "${version}"
    git push "${remote}" "${branch}"
  fi

  release_files=(VERSION README.md)

  for file in "${release_files[@]}"
  do
    if [[ -f "${file}" ]]
    then
      cp -f "${file}" "${release_path}/"
    else
      log "WARNING: Missing extension file: '${file}'"
    fi
  done

  release_directories=(bin config modules templates)

  for directory in "${release_directories[@]}"
  do
    if path_exists "${directory}"
    then
      cp -Rf "${directory}" "${release_path}/"
    else
      log "WARNING: Missing extension directory: '${directory}'"
    fi
  done

  if variable_is_nonempty sha1
  then
    echo "${sha1:0:7}" > "${release_path}/sha1"
  fi

  enter "$releases_path"

  # TODO: sha1 also.
  tar zcvf "${archives_path}/$release_name".tar.gz "$release_name/"
  file_md5 "${archives_path}/${release_name}.tar.gz" > "${archives_path}/${release_name}.tar.gz.md5"

  tar jcvf "${archives_path}/$release_name".tar.bz2 "$release_name/"
  file_md5 "${archives_path}/${release_name}.tar.bz2" > "${archives_path}/${release_name}.tar.bz2.md5"

  remove_paths "${release_name}/"

  log "Packaging of extension ${release_name} complete."
}

get_help()
{
  cat -v "$help_path/get"
}

#TODO: this code should be distributed to proper places
extension_cli()
{
  local _ignored_args=() _string

  number_of_args=${#extension_args[@]}

  for (( index=0 ; index < $number_of_args ; index++ ))
  do
    token="${extension_args[$index]}"

    case "$token" in
      --uri|--url)
        extension_uri="${extension_args[$((++index))]}"
        ;;
      --version)
        extension_version="${extension_args[$((++index))]}"
        ;;
      --archive_format)
        archive_format="${extension_args[$((++index))]}"
        ;;
      --licence)
        extension_license
        exit 0
        ;;
      --modules)
        _string="${extension_args[$((++index))]}"
        extension_modules=(${_string//,/ })
        ;;
      *)
        _ignored_args+=("${token}")
        ;;
    esac
  done

  if array_is_nonempty _ignored_args
  then
    extension_args=( "${_ignored_args[@]}" )
  fi
}
