import '@testing-library/jest-dom'

// Mock Taro Components
jest.mock('@tarojs/components', () => ({
  View: 'view',
  Text: 'text',
  Input: 'input',
  ScrollView: 'scroll-view',
  Picker: 'picker',
  Image: 'image'
}))

// Mock Taro APIs
jest.mock('@tarojs/taro', () => ({
  useRouter: () => ({
    params: {}
  }),
  navigateTo: jest.fn(),
  redirectTo: jest.fn(),
  switchTab: jest.fn(),
  reLaunch: jest.fn(),
  navigateBack: jest.fn(),
  showModal: jest.fn(),
  showToast: jest.fn(),
  showLoading: jest.fn(),
  hideLoading: jest.fn(),
  showActionSheet: jest.fn(),
  request: jest.fn(),
  uploadFile: jest.fn(),
  downloadFile: jest.fn(),
  connectSocket: jest.fn(),
  onSocketOpen: jest.fn(),
  onSocketError: jest.fn(),
  onSocketMessage: jest.fn(),
  onSocketClose: jest.fn(),
  sendSocketMessage: jest.fn(),
  closeSocket: jest.fn(),
  chooseImage: jest.fn(),
  previewImage: jest.fn(),
  getImageInfo: jest.fn(),
  saveImageToPhotosAlbum: jest.fn(),
  startRecord: jest.fn(),
  stopRecord: jest.fn(),
  playVoice: jest.fn(),
  pauseVoice: jest.fn(),
  stopVoice: jest.fn(),
  getBackgroundAudioPlayerState: jest.fn(),
  playBackgroundAudio: jest.fn(),
  pauseBackgroundAudio: jest.fn(),
  seekBackgroundAudio: jest.fn(),
  stopBackgroundAudio: jest.fn(),
  onBackgroundAudioPlay: jest.fn(),
  onBackgroundAudioPause: jest.fn(),
  onBackgroundAudioStop: jest.fn(),
  chooseVideo: jest.fn(),
  saveVideoToPhotosAlbum: jest.fn(),
  getLocation: jest.fn(),
  chooseLocation: jest.fn(),
  openLocation: jest.fn(),
  getSystemInfo: jest.fn(),
  getNetworkType: jest.fn(),
  onNetworkStatusChange: jest.fn(),
  onAccelerometerChange: jest.fn(),
  startAccelerometer: jest.fn(),
  stopAccelerometer: jest.fn(),
  onCompassChange: jest.fn(),
  startCompass: jest.fn(),
  stopCompass: jest.fn(),
  makePhoneCall: jest.fn(),
  scanCode: jest.fn(),
  setClipboardData: jest.fn(),
  getClipboardData: jest.fn(),
  openBluetoothAdapter: jest.fn(),
  closeBluetoothAdapter: jest.fn(),
  getBluetoothDevices: jest.fn(),
  getConnectedBluetoothDevices: jest.fn(),
  onBluetoothDeviceFound: jest.fn(),
  onBluetoothAdapterStateChange: jest.fn(),
  createBLEConnection: jest.fn(),
  closeBLEConnection: jest.fn(),
  getBLEDeviceServices: jest.fn(),
  getBLEDeviceCharacteristics: jest.fn(),
  readBLECharacteristicValue: jest.fn(),
  writeBLECharacteristicValue: jest.fn(),
  notifyBLECharacteristicValueChange: jest.fn(),
  onBLEConnectionStateChange: jest.fn(),
  onBLECharacteristicValueChange: jest.fn(),
  startBeaconDiscovery: jest.fn(),
  stopBeaconDiscovery: jest.fn(),
  getBeacons: jest.fn(),
  onBeaconUpdate: jest.fn(),
  onBeaconServiceChange: jest.fn(),
  addPhoneContact: jest.fn(),
  getHCEState: jest.fn(),
  startHCE: jest.fn(),
  stopHCE: jest.fn(),
  onHCEMessage: jest.fn(),
  sendHCEMessage: jest.fn(),
  startWifi: jest.fn(),
  stopWifi: jest.fn(),
  connectWifi: jest.fn(),
  getWifiList: jest.fn(),
  onGetWifiList: jest.fn(),
  setWifiList: jest.fn(),
  onWifiConnected: jest.fn(),
  getConnectedWifi: jest.fn(),
  showShareMenu: jest.fn(),
  hideShareMenu: jest.fn(),
  updateShareMenu: jest.fn(),
  getShareInfo: jest.fn(),
  authCode: jest.fn(),
  login: jest.fn(),
  checkSession: jest.fn(),
  authorize: jest.fn(),
  getUserInfo: jest.fn(),
  requestPayment: jest.fn(),
  showTabBarRedDot: jest.fn(),
  hideTabBarRedDot: jest.fn(),
  showTabBar: jest.fn(),
  hideTabBar: jest.fn(),
  setTabBarBadge: jest.fn(),
  removeTabBarBadge: jest.fn(),
  setTabBarItem: jest.fn(),
  setTabBarStyle: jest.fn(),
  setNavigationBarTitle: jest.fn(),
  setNavigationBarColor: jest.fn(),
  showNavigationBarLoading: jest.fn(),
  hideNavigationBarLoading: jest.fn(),
  setBackgroundColor: jest.fn(),
  setBackgroundTextStyle: jest.fn(),
  showTabBar: jest.fn(),
  hideTabBar: jest.fn(),
  setTabBarStyle: jest.fn(),
  setTabBarItem: jest.fn(),
  showTabBarRedDot: jest.fn(),
  hideTabBarRedDot: jest.fn(),
  setTabBarBadge: jest.fn(),
  removeTabBarBadge: jest.fn(),
  pageScrollTo: jest.fn(),
  startPullDownRefresh: jest.fn(),
  stopPullDownRefresh: jest.fn(),
  createSelectorQuery: jest.fn(),
  createIntersectionObserver: jest.fn(),
  getMenuButtonBoundingClientRect: jest.fn(),
  canvasToTempFilePath: jest.fn(),
  canvasPutImageData: jest.fn(),
  canvasGetImageData: jest.fn(),
  setStorage: jest.fn(),
  getStorage: jest.fn(),
  getStorageInfo: jest.fn(),
  removeStorage: jest.fn(),
  clearStorage: jest.fn(),
  setStorageSync: jest.fn(),
  getStorageSync: jest.fn(),
  getStorageInfoSync: jest.fn(),
  removeStorageSync: jest.fn(),
  clearStorageSync: jest.fn(),
  getSystemInfoSync: jest.fn(),
  getEnv: jest.fn(() => 'h5'),
  ENV_TYPE: {
    WEAPP: 'WEAPP',
    SWAN: 'SWAN',
    ALIPAY: 'ALIPAY',
    TT: 'TT',
    QQ: 'QQ',
    JD: 'JD',
    WEB: 'WEB',
    RN: 'RN',
    HARMONY: 'HARMONY'
  }
}))

// Mock React Query
jest.mock('@tanstack/react-query', () => ({
  useQuery: jest.fn(() => ({
    data: null,
    isLoading: false,
    error: null
  })),
  useMutation: jest.fn(() => ({
    mutate: jest.fn(),
    isLoading: false,
    error: null
  }))
}))

// Mock API client
jest.mock('../src/api', () => ({
  areaClient: {
    provinces: {
      $get: jest.fn(() => Promise.resolve({
        status: 200,
        json: () => Promise.resolve([
          { id: 1, name: '北京市', code: '110000' },
          { id: 2, name: '上海市', code: '310000' },
          { id: 3, name: '广东省', code: '440000' }
        ])
      }))
    },
    cities: {
      $get: jest.fn(() => Promise.resolve({
        status: 200,
        json: () => Promise.resolve([
          { id: 1, name: '北京市', code: '110100', provinceId: 1 },
          { id: 2, name: '上海市', code: '310100', provinceId: 2 },
          { id: 3, name: '广州市', code: '440100', provinceId: 3 },
          { id: 4, name: '深圳市', code: '440300', provinceId: 3 }
        ])
      }))
    },
    districts: {
      $get: jest.fn(() => Promise.resolve({
        status: 200,
        json: () => Promise.resolve([
          { id: 1, name: '东城区', code: '110101', cityId: 1 },
          { id: 2, name: '西城区', code: '110102', cityId: 1 },
          { id: 3, name: '天河区', code: '440106', cityId: 3 },
          { id: 4, name: '越秀区', code: '440104', cityId: 3 }
        ])
      }))
    }
  },
  locationClient: {
    $get: jest.fn(() => Promise.resolve({
      status: 200,
      json: () => Promise.resolve({
        data: [
          { id: 1, name: '北京首都国际机场', province: '北京市', city: '北京市', district: '顺义区' },
          { id: 2, name: '北京南站', province: '北京市', city: '北京市', district: '丰台区' },
          { id: 3, name: '上海虹桥机场', province: '上海市', city: '上海市', district: '长宁区' },
          { id: 4, name: '上海火车站', province: '上海市', city: '上海市', district: '静安区' }
        ]
      })
    }))
  },
  routeClient: {
    search: {
      $get: jest.fn(() => Promise.resolve({
        status: 200,
        json: () => Promise.resolve([
          {
            id: 1,
            startLocation: { name: '北京首都国际机场' },
            endLocation: { name: '上海虹桥机场' },
            activities: [
              { id: 1, name: '上海音乐节', startDate: '2025-10-20', venueLocation: { name: '上海音乐厅' } }
            ],
            routeType: 'departure'
          }
        ])
      }))
    }
  }
}))