#!/usr/bin/bash
# shellcheck disable=SC2034
dns_muumuu_info='muumuu-domain.com
Site: muumuu-domain.com
Docs: github.com/acmesh-official/acme.sh/wiki/dnsapi2#dns_muumuu
Options:
 MUUMUU_PAT Personal Access Token (scopes: domains:read, dns:read, dns:write)
Issues: github.com/acmesh-official/acme.sh/issues/7011
'

MUUMUU_API="https://muumuu-domain.com/api/v2"

########  Public functions #####################

dns_muumuu_add() {
  fulldomain="$(echo "$1" | _lower_case)"
  txtvalue="$2"

  _info "Using muumuu-domain.com DNS API"
  _debug fulldomain "$fulldomain"
  _debug txtvalue "$txtvalue"

  MUUMUU_PAT="${MUUMUU_PAT:-$(_readaccountconf_mutable MUUMUU_PAT)}"
  if [ -z "$MUUMUU_PAT" ]; then
    _err "MUUMUU_PAT is not set."
    _err "Please create a Personal Access Token at https://muumuu-domain.com"
    _err "with scopes: domains:read, dns:read, dns:write"
    return 1
  fi
  _saveaccountconf_mutable MUUMUU_PAT "$MUUMUU_PAT"

  if ! _muumuu_get_root "$fulldomain"; then
    _err "Unable to find the root domain for $fulldomain"
    return 1
  fi
  _debug _domain_id "$_domain_id"
  _debug _sub_domain "$_sub_domain"
  _debug _domain "$_domain"

  _info "Adding TXT record for ${fulldomain}"
  body="{\"fqdn\":\"${fulldomain}.\",\"type\":\"TXT\",\"value\":\"${txtvalue}\",\"ttl\":3600}"
  if _muumuu_rest POST "/me/domains/${_domain_id}/dns-records" "$body"; then
    if [ "$_muumuu_code" = "201" ]; then
      _info "TXT record added successfully"
      return 0
    fi
  fi

  _err "Failed to add TXT record (HTTP ${_muumuu_code})"
  return 1
}

dns_muumuu_rm() {
  fulldomain="$(echo "$1" | _lower_case)"
  txtvalue="$2"

  _info "Using muumuu-domain.com DNS API"
  _debug fulldomain "$fulldomain"
  _debug txtvalue "$txtvalue"

  MUUMUU_PAT="${MUUMUU_PAT:-$(_readaccountconf_mutable MUUMUU_PAT)}"
  if [ -z "$MUUMUU_PAT" ]; then
    _err "MUUMUU_PAT is not set."
    return 1
  fi

  if ! _muumuu_get_root "$fulldomain"; then
    _err "Unable to find the root domain for $fulldomain"
    return 1
  fi
  _debug _domain_id "$_domain_id"

  _info "Looking up TXT record for ${fulldomain}"
  if ! _muumuu_rest GET "/me/domains/${_domain_id}/dns-records?type=TXT&fqdn=${fulldomain}."; then
    _err "Failed to list TXT records"
    return 1
  fi

  record_id=$(echo "$response" | _egrep_o "\"id\":[0-9]+[^}]*\"value\":\"${txtvalue}\"" | _egrep_o "\"id\":[0-9]+" | _head_n 1 | cut -d: -f2)
  if [ -z "$record_id" ]; then
    _info "TXT record not found, nothing to remove"
    return 0
  fi
  _debug record_id "$record_id"

  if _muumuu_rest DELETE "/me/domains/${_domain_id}/dns-records/${record_id}"; then
    if [ "$_muumuu_code" = "204" ]; then
      _info "TXT record deleted successfully"
      return 0
    fi
  fi

  _err "Failed to delete TXT record (HTTP ${_muumuu_code})"
  return 1
}

####################  Private functions below ##################################

#  _acme-challenge.www.example.com
# sets:
#  _domain_id   MU00000001
#  _sub_domain  _acme-challenge.www
#  _domain      example.com
_muumuu_get_root() {
  domain="$1"
  i=1
  p=0
  h=""
  while true; do
    h=$(printf "%s" "$domain" | cut -d . -f "$i"-100)
    if [ -z "$h" ]; then
      return 1
    fi
    if ! _muumuu_rest GET "/me/domains?fqdn=${h}&page-size=1"; then
      return 1
    fi
    if [ "$_muumuu_code" = "401" ] || [ "$_muumuu_code" = "403" ]; then
      _err "Authentication failed (HTTP ${_muumuu_code}). Check MUUMUU_PAT."
      return 1
    fi
    if _contains "$response" "\"fqdn\":\"${h}\""; then
      _domain_id=$(echo "$response" | _egrep_o "\"id\":\"MU[0-9]+\"" | _head_n 1 | cut -d: -f2 | tr -d '"')
      _domain="$h"
      if [ "$p" = "0" ]; then
        _sub_domain=""
      else
        _sub_domain=$(printf "%s" "$domain" | cut -d . -f 1-"$p")
      fi
      return 0
    fi
    p="$i"
    i=$(_math "$i" + 1)
  done
}

_muumuu_rest() {
  _muumuu_method="$1"
  _muumuu_path="$2"
  _muumuu_data="$3"
  _muumuu_url="${MUUMUU_API}${_muumuu_path}"

  export _H1="Authorization: Bearer ${MUUMUU_PAT}"
  export _H2="Content-Type: application/json"
  export _H3="Accept: application/json"
  export _H4=""
  export _H5=""

  _secure_debug2 data "$_muumuu_data"

  if [ "$_muumuu_method" = "GET" ]; then
    response="$(_get "$_muumuu_url")"
  else
    response="$(_post "$_muumuu_data" "$_muumuu_url" "" "$_muumuu_method")"
  fi
  _muumuu_ret="$?"
  _muumuu_code="$(grep "^HTTP" "$HTTP_HEADER" | _tail_n 1 | cut -d " " -f 2 | tr -d "\\r\\n")"
  _debug "HTTP code: ${_muumuu_code}"
  _secure_debug2 response "$response"

  if [ "$_muumuu_ret" != "0" ]; then
    _err "Error accessing ${_muumuu_url}"
    return 1
  fi

  response="$(printf "%s" "$response" | _normalizeJson)"
  return 0
}
