/**
 * 统一 Provider 使用示例
 * 展示如何使用 EIP-1193 provider 与不同钱包交互
 */
import { 
  UnifiedPassportSDK,
  EIP1193Provider,
  UnifiedPassportSDKConfig 
} from '../src';

// T-Rex 测试网配置
const tRexTestnetConfig = {
  id: 1962,
  name: 'T-Rex Testnet',
  rpcUrls: { 
    default: { 
      http: ['https://testnetrpc.trex.xyz'] 
    } 
  },
  nativeCurrency: {
    name: 'Ether',
    symbol: 'ETH',
    decimals: 18,
  },
  blockExplorers: {
    default: { 
      name: 'T-Rex Explorer', 
      url: 'https://explorer.trex.com' 
    },
  },
};

/**
 * 示例 1: 使用 MetaMask
 */
export async function useWithMetaMask() {
  // 检查 MetaMask 是否可用
  if (typeof window !== 'undefined' && window.ethereum) {
    console.log('🦊 检测到 MetaMask');

    const sdk = new UnifiedPassportSDK({
      provider: window.ethereum,
      chain: tRexTestnetConfig,
      env: 'dev',
    });

    try {
      // 连接钱包
      const accounts = await sdk.connectWallet();
      console.log('✅ 连接成功:', accounts[0]);

      // 获取 provider 信息
      const providerInfo = sdk.getProviderInfo();
      console.log('📋 Provider 信息:', providerInfo);

      // 切换到正确的网络
      await sdk.switchChain();
      console.log('🌐 网络切换成功');

      // 检查是否有 Passport
      const result = await sdk.checkWalletHasPassport(accounts[0] as `0x${string}`);
      console.log('🔍 Passport 检查结果:', result);

      return sdk;
    } catch (error) {
      console.error('❌ MetaMask 操作失败:', error);
      throw error;
    }
  } else {
    throw new Error('❌ 未检测到 MetaMask');
  }
}

/**
 * 示例 2: 使用任何兼容的 provider
 */
export async function useWithAnyProvider(provider: EIP1193Provider) {
  console.log('🔌 使用自定义 provider');

  const sdk = new UnifiedPassportSDK({
    provider,
    chain: tRexTestnetConfig,
    env: 'dev',
  });

  try {
    // 获取账户
    const accounts = await sdk.getAccounts();
    if (accounts.length === 0) {
      // 如果没有连接，请求连接
      await sdk.connectWallet();
    }

    // 创建 Passport
    console.log('🆕 正在创建 Passport...');
    const createTxHash = await sdk.createPassport();
    console.log('✅ Passport 创建交易:', createTxHash);

    return sdk;
  } catch (error) {
    console.error('❌ Provider 操作失败:', error);
    throw error;
  }
}

/**
 * 示例 3: 监听钱包事件
 */
export function setupWalletEventListeners(sdk: UnifiedPassportSDK) {
  console.log('👂 设置钱包事件监听器');

  // 监听账户变化
  sdk.onAccountsChanged((accounts) => {
    console.log('👤 账户已更改:', accounts);
    if (accounts.length === 0) {
      console.log('🔓 钱包已断开连接');
    }
  });

  // 监听网络变化
  sdk.onChainChanged((chainId) => {
    console.log('🌐 网络已更改:', chainId);
    const chainIdNumber = parseInt(chainId, 16);
    if (chainIdNumber !== 1962) {
      console.warn('⚠️ 当前网络不是 T-Rex 测试网');
    }
  });

  return {
    cleanup: () => {
      // 移除监听器的示例（实际实现需要保存回调引用）
      console.log('🧹 清理事件监听器');
    }
  };
}

/**
 * 示例 4: 完整的 Passport 操作流程
 */
export async function completePassportWorkflow(sdk: UnifiedPassportSDK) {
  try {
    const accounts = await sdk.getAccounts();
    const userAddress = accounts[0];

    console.log('🔄 开始完整的 Passport 工作流程');

    // 1. 检查是否已有 Passport
    const hasPassport = await sdk.checkWalletHasPassport(userAddress as `0x${string}`);
    
    if (!hasPassport.hasPassport) {
      // 2. 创建 Passport
      console.log('🆕 创建新的 Passport...');
      const createTx = await sdk.createPassport();
      console.log('✅ Passport 创建交易:', createTx);
      
      // 等待交易确认后再检查
      // 注意：实际应用中需要等待交易确认
      console.log('⏳ 请等待交易确认后再继续...');
      return;
    }

    // 3. 获取 Passport 详细信息
    console.log('📖 获取 Passport 信息...');
    const passportInfo = await sdk.getPassportInfo(hasPassport.passportAddress!);
    console.log('📋 Passport 信息:', passportInfo);

    // 4. 如果需要，可以进行钱包绑定操作
    if (passportInfo.walletCount < 2) {
      console.log('🔗 当前只有一个钱包，可以绑定更多钱包');
      // 这里可以添加绑定其他钱包的逻辑
    }

    return passportInfo;
  } catch (error) {
    console.error('❌ Passport 工作流程失败:', error);
    throw error;
  }
}

/**
 * 示例 5: 错误处理和重试机制
 */
export async function robustPassportOperation(sdk: UnifiedPassportSDK) {
  const maxRetries = 3;
  let retryCount = 0;

  while (retryCount < maxRetries) {
    try {
      const accounts = await sdk.getAccounts();
      
      if (accounts.length === 0) {
        throw new Error('没有连接的账户');
      }

      const result = await sdk.checkWalletHasPassport(accounts[0] as `0x${string}`);
      console.log('✅ 操作成功:', result);
      return result;

    } catch (error: any) {
      retryCount++;
      console.warn(`⚠️ 尝试 ${retryCount}/${maxRetries} 失败:`, error.message);

      if (retryCount >= maxRetries) {
        console.error('❌ 所有重试都失败了');
        throw error;
      }

      // 等待一段时间后重试
      await new Promise(resolve => setTimeout(resolve, 2000));
    }
  }
}

// 类型安全的使用示例
export function createTypeSafeSDK(config: UnifiedPassportSDKConfig): UnifiedPassportSDK {
  // 验证配置
  if (!config.provider) {
    throw new Error('Provider 是必需的');
  }
  
  if (!config.chain || !config.chain.id) {
    throw new Error('链配置是必需的');
  }

  return new UnifiedPassportSDK(config);
} 