#!/usr/bin/env bash
# meclone — branded rclone wrapper for meWork360 (WebDAV/Nextcloud) and MeStorage (S3).
set -euo pipefail

MECLONE_VERSION="1.0.0"
MECLONE_CONFIG_DIR="${MECLONE_CONFIG_DIR:-${HOME}/.config/meclone}"
MECLONE_CONF="${MECLONE_CONFIG_DIR}/rclone.conf"
MECLONE_BIN="$(basename "${BASH_SOURCE[0]}")"

RCLONE_DEFAULTS=(--transfers 4 --retries 3 --progress)

require_rclone() {
  if command -v rclone >/dev/null 2>&1; then
    return 0
  fi

  cat <<'EOF' >&2
meclone: rclone não encontrado no PATH.

Instale o rclone upstream (MIT) antes de continuar:
  curl -O https://rclone.org/install.sh && sudo bash install.sh

Ou siga: https://rclone.org/install/

Este wrapper não instala o rclone automaticamente — confirme a instalação manualmente.
EOF
  exit 1
}

ensure_config_dir() {
  mkdir -p "${MECLONE_CONFIG_DIR}"
  if [[ ! -f "${MECLONE_CONF}" ]]; then
    touch "${MECLONE_CONF}"
    chmod 600 "${MECLONE_CONF}"
  fi
}

rclone_cmd() {
  RCLONE_CONFIG="${MECLONE_CONF}" rclone "$@"
}

prompt() {
  local var_name="$1"
  local message="$2"
  local secret="${3:-false}"
  local value=""

  if [[ "${secret}" == "true" ]]; then
    read -r -s -p "${message}" value
    echo >&2
  else
    read -r -p "${message}" value
  fi

  printf -v "${var_name}" '%s' "${value}"
}

normalize_tenant_url() {
  local url="$1"
  url="${url%/}"
  if [[ ! "${url}" =~ ^https?:// ]]; then
    url="https://${url}"
  fi
  printf '%s' "${url}"
}

config_work360() {
  local tenant_url username password remote_name dav_url

  cat <<'EOF'

=== meclone config work360 ===
Configure um remote WebDAV para meWork360 (Nextcloud) com chunking nativo.

Recomendamos senha de aplicativo (app password) em vez da senha de login:
  Nextcloud → Configurações → Segurança → Senhas de aplicativo → Criar nova

EOF

  prompt tenant_url "URL do tenant (ex.: https://cliente.mework360.com.br): "
  prompt username "Usuário Nextcloud: "
  prompt password "Senha ou app password: " true
  prompt remote_name "Nome do remote [work360]: "
  remote_name="${remote_name:-work360}"

  tenant_url="$(normalize_tenant_url "${tenant_url}")"
  dav_url="${tenant_url}/remote.php/dav/files/${username}/"

  ensure_config_dir
  rclone_cmd config delete "${remote_name}" >/dev/null 2>&1 || true
  rclone_cmd config create "${remote_name}" webdav \
    url="${dav_url}" \
    vendor=nextcloud \
    user="${username}" \
    pass="${password}" \
    nextcloud_chunk_size=10M

  echo
  echo "Remote '${remote_name}' criado em ${MECLONE_CONF}"
  echo "Teste: ${MECLONE_BIN} ls ${remote_name}:"
}

config_mestorage() {
  local endpoint access_key secret_key remote_name

  cat <<'EOF'

=== meclone config mestorage ===
Configure um remote S3-compatível para MeStorage.

Obtenha access key / secret key no painel MeStorage ou via operador Mecloud.

EOF

  prompt endpoint "Endpoint S3 (ex.: https://s3.mestorage.com.br): "
  prompt access_key "Access Key ID: "
  prompt secret_key "Secret Access Key: " true
  prompt remote_name "Nome do remote [mestorage]: "
  remote_name="${remote_name:-mestorage}"

  endpoint="$(normalize_tenant_url "${endpoint}")"

  ensure_config_dir
  rclone_cmd config delete "${remote_name}" >/dev/null 2>&1 || true
  rclone_cmd config create "${remote_name}" s3 \
    provider=Other \
    env_auth=false \
    access_key_id="${access_key}" \
    secret_access_key="${secret_key}" \
    endpoint="${endpoint}" \
    acl=private \
    force_path_style=true

  echo
  echo "Remote '${remote_name}' criado em ${MECLONE_CONF}"
  echo "Teste: ${MECLONE_BIN} lsd ${remote_name}:"
}

config_help() {
  cat <<EOF
Uso: ${MECLONE_BIN} config <work360|mestorage>

  work360    Assistente WebDAV meWork360 (vendor=nextcloud, chunk 10M)
  mestorage  Assistente S3 MeStorage (path-style)

Config isolada: ${MECLONE_CONF}
EOF
}

show_help() {
  cat <<EOF
meclone ${MECLONE_VERSION} — CLI meWork360 / MeStorage sobre rclone

Uso:
  ${MECLONE_BIN} config work360          Configura remote Nextcloud/WebDAV
  ${MECLONE_BIN} config mestorage        Configura remote S3 MeStorage
  ${MECLONE_BIN} sync|copy|ls|lsd|check  Repassa ao rclone (defaults seguros)
  ${MECLONE_BIN} --help                  Esta ajuda

Config: ${MECLONE_CONF} (não altera ~/.config/rclone/rclone.conf)

Defaults em sync/copy/check: --transfers 4 --retries 3 --progress

Exemplos:

  # Enviar pasta local para Files no tenant work360
  ${MECLONE_BIN} sync ~/Documentos/clinica work360:Clinica/Backup

  # Backup para bucket MeStorage
  ${MECLONE_BIN} copy work360:Arquivos mestorage:backup-tenant/arquivos

  # Listar raiz do remote
  ${MECLONE_BIN} ls work360:

  # Cron diário (02:00) — log em ~/meclone-sync.log
  0 2 * * * ${MECLONE_BIN} sync /dados/entrada work360:Importacao >> ~/meclone-sync.log 2>&1

Relacionado: ISSUE-249 (work-platform-api) — uploads WebDAV sem vendor=nextcloud
             enviam PUT único e podem falhar com HTTP 413 em arquivos grandes.

Licença: wrapper MIT (meclone); rclone MIT upstream — https://rclone.org/
EOF
}

run_passthrough() {
  local subcmd="$1"
  shift
  ensure_config_dir
  rclone_cmd "${subcmd}" "${RCLONE_DEFAULTS[@]}" "$@"
}

main() {
  if [[ $# -eq 0 ]]; then
    show_help
    exit 0
  fi

  case "$1" in
    -h|--help|help)
      show_help
      ;;
    -V|--version|version)
      echo "meclone ${MECLONE_VERSION}"
      ;;
    config)
      require_rclone
      shift
      case "${1:-}" in
        work360) config_work360 ;;
        mestorage) config_mestorage ;;
        ""|-h|--help) config_help ;;
        *)
          echo "meclone: subcomando config desconhecido: $1" >&2
          config_help
          exit 1
          ;;
      esac
      ;;
    sync|copy|check)
      require_rclone
      run_passthrough "$@"
      ;;
    ls|lsd)
      require_rclone
      ensure_config_dir
      rclone_cmd "$@"
      ;;
    *)
      require_rclone
      ensure_config_dir
      rclone_cmd "$@"
      ;;
  esac
}

main "$@"
