#!/bin/bash
# Guild activation recovery for Mac. Version 20261009-v1.
# Matches ActivationService.deactivate / DeviceIdentityStore.forgetChain.
# Never read/delete the device private key or an agent's files.
set -eu

fail() { printf '\nОшибка: %s\n' "$1" >&2; exit 1; }

[ "$(/usr/bin/uname -s)" = Darwin ] || fail 'Этот скрипт предназначен только для Mac.'
[ "$(/usr/bin/id -u)" != 0 ] || fail 'Запустите без sudo, из своей учётной записи Mac.'
[ "$#" -le 1 ] || fail 'Допустим только параметр --dry-run.'
dry_run=0
if [ "$#" = 1 ]; then
    [ "$1" = --dry-run ] || fail 'Допустим только параметр --dry-run.'
    dry_run=1
fi

# Do not quit the app or kill agents for the user. Its cached licence state
# must be gone before changing Keychain/preferences.
if /usr/bin/pgrep -u "$(/usr/bin/id -u)" -x GuildApp >/dev/null 2>&1; then
    fail 'Сначала завершите Continental Guild через Command-Q и запустите команду снова.'
else
    status=$?
    [ "$status" = 1 ] || fail 'Не удалось проверить, закрыто ли приложение.'
fi

printf '%s\n' \
    'Снятие локальной активации Continental Guild на этом Mac.' \
    'Агенты, переписка, проекты и ключ устройства останутся на месте.' \
    'После этого откройте Guild и введите НОВЫЙ ключ активации из своего кабинета.' \
    'Скрипт не меняет доступ на сервере и не освобождает там места устройств.'

if [ "$dry_run" = 1 ]; then
    printf '\nПроверка завершена. Ничего не изменено.\n'
    exit 0
fi

printf '\nДля подтверждения введите YES: '
answer=''
if ! IFS= read -r answer </dev/tty; then
    fail 'Нужен интерактивный Терминал. Ничего не изменено.'
fi
[ "$answer" = YES ] || { printf 'Отменено. Ничего не изменено.\n'; exit 0; }

service=com.continental.guild.device
domain=com.continental.guild

delete_item() {
    local account="$1" status
    # No -g/-w: never request or print password/private-key values.
    if /usr/bin/security find-generic-password -s "$service" -a "$account" >/dev/null 2>&1; then
        if ! /usr/bin/security delete-generic-password -s "$service" -a "$account" >/dev/null 2>&1; then
            fail 'Связка ключей не разрешила снять активацию. Дальнейшие изменения остановлены.'
        fi
    else
        status=$?
        [ "$status" = 44 ] || fail 'Не удалось проверить запись в Связке ключей. Дальнейшие изменения остановлены.'
    fi
    if /usr/bin/security find-generic-password -s "$service" -a "$account" >/dev/null 2>&1; then
        fail 'Запись активации осталась в Связке ключей. Обратитесь за помощью.'
    else
        status=$?
        [ "$status" = 44 ] || fail 'Не удалось подтвердить снятие активации.'
    fi
}

# Exact existing reset scope; device-key is deliberately retained.
delete_item device-chain
delete_item report-token
for key in service.revoked service.suspended service.certNotAfter; do
    if /usr/bin/defaults read "$domain" "$key" >/dev/null 2>&1; then
        /usr/bin/defaults delete "$domain" "$key" >/dev/null 2>&1 \
            || fail 'Не удалось убрать прежний статус активации из настроек.'
    fi
done

printf '\nГотово. Откройте Continental Guild и активируйте его новым ключом из кабинета:\n'
printf '%s\n' 'https://guild.app.continental-c.com/cabinet/?tab=mac'
