#!/bin/bash

# Verify All Deployments
# This script verifies that all contracts are deployed and registered correctly

set -e

# Colors
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

# Load .env
if [ -f .env ]; then
    set -a
    source .env
    set +a
fi

RPC_URL=${RPC_URL:-${RPC_URL_138:-"http://192.168.11.250:8545"}}

echo -e "${BLUE}╔══════════════════════════════════════════════════════════════╗${NC}"
echo -e "${BLUE}║     Deployment Verification                                 ║${NC}"
echo -e "${BLUE}╚══════════════════════════════════════════════════════════════╝${NC}"
echo ""

verify_contract() {
    local name=$1
    local address=$2
    
    if [ -z "$address" ] || [ "$address" = "null" ]; then
        echo -e "${RED}❌ $name: Address not set${NC}"
        return 1
    fi
    
    local code=$(cast code "$address" --rpc-url "$RPC_URL" 2>/dev/null || echo "")
    local code_size=$(echo -n "$code" | wc -c)
    
    if [ "$code_size" -gt 100 ]; then
        echo -e "${GREEN}✅ $name: Deployed at $address (Code: $code_size bytes)${NC}"
        return 0
    else
        echo -e "${RED}❌ $name: Not deployed or invalid (Code: $code_size bytes)${NC}"
        return 1
    fi
}

verify_registration() {
    local registry=$1
    local contract=$2
    local name=$3
    
    if [ -z "$registry" ] || [ -z "$contract" ]; then
        echo -e "${YELLOW}⚠️  $name: Cannot verify (addresses not set)${NC}"
        return 1
    fi
    
    local registered=$(cast call "$registry" "isContractRegistered(address)" "$contract" --rpc-url "$RPC_URL" 2>/dev/null || echo "false")
    if [ "$registered" = "true" ]; then
        echo -e "${GREEN}✅ $name: Registered in ComplianceRegistry${NC}"
        return 0
    else
        echo -e "${YELLOW}⚠️  $name: Not registered in ComplianceRegistry${NC}"
        return 1
    fi
}

verify_token_registration() {
    local registry=$1
    local token=$2
    local name=$3
    
    if [ -z "$registry" ] || [ -z "$token" ]; then
        echo -e "${YELLOW}⚠️  $name: Cannot verify (addresses not set)${NC}"
        return 1
    fi
    
    local registered=$(cast call "$registry" "isTokenRegistered(address)" "$token" --rpc-url "$RPC_URL" 2>/dev/null || echo "false")
    if [ "$registered" = "true" ]; then
        echo -e "${GREEN}✅ $name: Registered in TokenRegistry${NC}"
        return 0
    else
        echo -e "${YELLOW}⚠️  $name: Not registered in TokenRegistry${NC}"
        return 1
    fi
}

echo -e "${YELLOW}Contract Deployment Status:${NC}"
echo ""

verify_contract "ComplianceRegistry" "$COMPLIANCE_REGISTRY_ADDRESS"
verify_contract "CompliantUSDT" "$COMPLIANT_USDT_ADDRESS"
verify_contract "CompliantUSDC" "$COMPLIANT_USDC_ADDRESS"
verify_contract "TokenRegistry" "$TOKEN_REGISTRY_ADDRESS"
verify_contract "FeeCollector" "$FEE_COLLECTOR_ADDRESS"

echo ""
echo -e "${YELLOW}Compliance Registry Status:${NC}"
echo ""

verify_registration "$COMPLIANCE_REGISTRY_ADDRESS" "$COMPLIANT_USDT_ADDRESS" "CompliantUSDT"
verify_registration "$COMPLIANCE_REGISTRY_ADDRESS" "$COMPLIANT_USDC_ADDRESS" "CompliantUSDC"

echo ""
echo -e "${YELLOW}Token Registry Status:${NC}"
echo ""

verify_token_registration "$TOKEN_REGISTRY_ADDRESS" "$COMPLIANT_USDT_ADDRESS" "CompliantUSDT"
verify_token_registration "$TOKEN_REGISTRY_ADDRESS" "$COMPLIANT_USDC_ADDRESS" "CompliantUSDC"

echo ""
echo -e "${BLUE}Verification Complete!${NC}"
echo ""

