#!/usr/bin/env zsh

matches_any_rule() {
  local path="$1"
  shift
  local regex
  for regex in "$@"; do
    [[ -n "${regex}" ]] || continue
    if [[ "${path}" =~ ${regex} ]]; then
      return 0
    fi
  done
  return 1
}

enc_to_plain() {
  local enc="$1"
  [[ "${enc}" == *.enc.yaml ]] || return 1
  print -r -- "${enc%.enc.yaml}.yaml"
}

plain_to_enc() {
  local plain="$1"
  [[ "${plain}" == *.yaml ]] || return 1
  if [[ "${plain}" == *.enc.yaml ]]; then
    print -r -- "${plain}"
  else
    print -r -- "${plain%.yaml}.enc.yaml"
  fi
}

hmac_sidecar_for_enc() {
  local enc="$1"
  print -r -- "${enc}.sync-hmac"
}

encrypt_plain_to_enc() {
  local plain="$1"
  local enc="$2"
  sops --encrypt --input-type yaml --output-type yaml --output "${enc}" "${plain}"
}

decrypt_enc_to_plain() {
  local enc="$1"
  sops --decrypt "${enc}"
}

compute_hmac_for_file() {
  local path="$1"
  openssl dgst -sha256 -hmac "${SOPS_SYNC_HMAC_KEY}" "${path}" | awk '{print $NF}'
}

compute_hmac_for_stdin() {
  openssl dgst -sha256 -hmac "${SOPS_SYNC_HMAC_KEY}" | awk '{print $NF}'
}

read_sidecar() {
  local sidecar="$1"
  [ -f "${sidecar}" ] || return 1
  tr -d '\r\n' < "${sidecar}"
}

write_sidecar() {
  local sidecar="$1"
  local value="$2"
  print -r -- "${value}" > "${sidecar}"
}

is_sops_encrypted_file() {
  local path="$1"
  [ -f "${path}" ] || return 1
  grep -q 'sops:' "${path}" && grep -q 'ENC\[' "${path}"
}

has_unstaged_changes() {
  local path="$1"
  if git ls-files --error-unmatch -- "${path}" >/dev/null 2>&1; then
    git diff --quiet -- "${path}" >/dev/null 2>&1
    return $?
  fi

  if git diff --cached --name-only -- "${path}" | grep -Fxq "${path}"; then
    git diff --quiet -- "${path}" >/dev/null 2>&1
    return $?
  fi

  return 1
}
