#!/usr/bin/env bash
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
CONFIG_PATH="${1:-$SCRIPT_DIR/dao.config.env}"

if [[ ! -f "$CONFIG_PATH" ]]; then
  echo "Ошибка: не найден конфиг $CONFIG_PATH"
  exit 1
fi

# shellcheck disable=SC1090
source "$CONFIG_PATH"

require_cmd() {
  if ! command -v "$1" >/dev/null 2>&1; then
    echo "Ошибка: команда '$1' не найдена"
    exit 1
  fi
}

require_cmd solana
require_cmd solana-keygen
require_cmd node

if [[ -z "${DAO_REALM_NAME:-}" || -z "${DAO_CLUSTER:-}" || -z "${DAO_ISSUER_KEYPAIR:-}" || -z "${SPL_GOVERNANCE_PROGRAM_ID:-}" ]]; then
  echo "Ошибка: обязательные поля конфига пустые"
  exit 1
fi

if [[ ! -f "$DAO_ISSUER_KEYPAIR" ]]; then
  echo "Ошибка: keypair не найден: $DAO_ISSUER_KEYPAIR"
  exit 1
fi

if [[ "${DAO_REALM_NAME}" == *"TEMPLATE"* || "${DAO_REALM_NAME}" == *"CHANGE_ME"* ]]; then
  echo "Ошибка: похоже, не заменили тестовое имя DAO_REALM_NAME"
  exit 1
fi

if ! [[ "${DAO_VOTING_TIME_SEC}" =~ ^[0-9]+$ ]] || ! [[ "${DAO_GOV_NFT_SUPPLY}" =~ ^[0-9]+$ ]] || ! [[ "${DAO_APPROVAL_THRESHOLD_PERCENT}" =~ ^[0-9]+$ ]]; then
  echo "Ошибка: числовые параметры заданы некорректно"
  exit 1
fi

if (( DAO_APPROVAL_THRESHOLD_PERCENT < 51 || DAO_APPROVAL_THRESHOLD_PERCENT > 100 )); then
  echo "Ошибка: DAO_APPROVAL_THRESHOLD_PERCENT должен быть в диапазоне 51..100"
  exit 1
fi

ISSUER_PUBKEY="$(solana-keygen pubkey "$DAO_ISSUER_KEYPAIR")"
ISSUER_BALANCE="$(solana balance "$ISSUER_PUBKEY" --url "$DAO_CLUSTER" 2>/dev/null || true)"

REALM_PDA="$(node - "$DAO_REALM_NAME" "$SPL_GOVERNANCE_PROGRAM_ID" <<'NODE'
const { PublicKey } = require("@solana/web3.js");
const realmName = process.argv[2];
const programId = new PublicKey(process.argv[3]);
const [pda] = PublicKey.findProgramAddressSync(
  [Buffer.from("governance"), Buffer.from(realmName, "utf8")],
  programId
);
console.log(pda.toBase58());
NODE
)"

if [[ -z "$REALM_PDA" ]]; then
  echo "Ошибка: не удалось вычислить PDA realm."
  exit 1
fi

REALM_EXISTS="no"
if solana account "$REALM_PDA" --url "$DAO_CLUSTER" >/dev/null 2>&1; then
  REALM_EXISTS="yes"
fi

cat <<EOF
============================================================
ПРЕДСТАРТОВАЯ ПРОВЕРКА DAO (Realms)
------------------------------------------------------------
Сеть:                     $DAO_CLUSTER
Realm name:               $DAO_REALM_NAME
Realm PDA:                $REALM_PDA
Realm уже существует:     $REALM_EXISTS
Governance program:       $SPL_GOVERNANCE_PROGRAM_ID
Эмиттер (issuer):         $ISSUER_PUBKEY
Баланс эмиттера:          ${ISSUER_BALANCE:-unknown}
NFT name:                 $DAO_GOV_NFT_NAME
NFT symbol:               $DAO_GOV_NFT_SYMBOL
NFT supply:               $DAO_GOV_NFT_SUPPLY
Voting time (sec):        $DAO_VOTING_TIME_SEC
Threshold %:              $DAO_APPROVAL_THRESHOLD_PERCENT
Конфиг:                   $CONFIG_PATH
============================================================
EOF

if [[ "$REALM_EXISTS" == "yes" ]]; then
  echo "Стоп: realm с таким именем уже существует в этой сети."
  echo "Поменяйте DAO_REALM_NAME в конфиге и запустите снова."
  exit 1
fi

echo
echo "Проверка пройдена."
echo "Этот скрипт делает только preflight-валидацию."
echo "Для реального создания DAO запускайте исполняющий скрипт:"
echo "node scripts/dao/create_realm_dao_full_build_exec.js scripts/dao/dao.config.env"
