import React from 'react'
import { render, fireEvent, waitFor } from '@testing-library/react'
import DealerWithdraw from '../index'
import { useDealerUser } from '@/hooks/useDealerUser'
import * as withdrawAPI from '@/api/shop/shopDealerWithdraw'

// Mock dependencies
jest.mock('@/hooks/useDealerUser')
jest.mock('@/api/shop/shopDealerWithdraw')
jest.mock('@tarojs/taro', () => ({
  showToast: jest.fn(),
  getStorageSync: jest.fn(() => 123),
}))

const mockUseDealerUser = useDealerUser as jest.MockedFunction<typeof useDealerUser>
const mockAddShopDealerWithdraw = withdrawAPI.addShopDealerWithdraw as jest.MockedFunction<typeof withdrawAPI.addShopDealerWithdraw>
const mockPageShopDealerWithdraw = withdrawAPI.pageShopDealerWithdraw as jest.MockedFunction<typeof withdrawAPI.pageShopDealerWithdraw>

describe('DealerWithdraw', () => {
  const mockDealerUser = {
    userId: 123,
    money: '10000.00',
    realName: '测试用户',
    mobile: '13800138000'
  }

  beforeEach(() => {
    mockUseDealerUser.mockReturnValue({
      dealerUser: mockDealerUser,
      loading: false,
      error: null,
      refresh: jest.fn()
    })

    mockPageShopDealerWithdraw.mockResolvedValue({
      list: [],
      count: 0
    })
  })

  afterEach(() => {
    jest.clearAllMocks()
  })

  test('应该正确显示可提现余额', () => {
    const { getByText } = render(<DealerWithdraw />)
    expect(getByText('10000.00')).toBeInTheDocument()
    expect(getByText('可提现余额')).toBeInTheDocument()
  })

  test('应该验证最低提现金额', async () => {
    mockAddShopDealerWithdraw.mockResolvedValue('success')
    
    const { getByPlaceholderText, getByText } = render(<DealerWithdraw />)
    
    // 输入低于最低金额的数值
    const amountInput = getByPlaceholderText('请输入提现金额')
    fireEvent.change(amountInput, { target: { value: '50' } })
    
    // 选择提现方式
    const wechatRadio = getByText('微信钱包')
    fireEvent.click(wechatRadio)
    
    // 提交表单
    const submitButton = getByText('申请提现')
    fireEvent.click(submitButton)
    
    await waitFor(() => {
      expect(require('@tarojs/taro').showToast).toHaveBeenCalledWith({
        title: '最低提现金额为100元',
        icon: 'error'
      })
    })
  })

  test('应该验证提现金额不超过可用余额', async () => {
    const { getByPlaceholderText, getByText } = render(<DealerWithdraw />)
    
    // 输入超过可用余额的金额
    const amountInput = getByPlaceholderText('请输入提现金额')
    fireEvent.change(amountInput, { target: { value: '20000' } })
    
    // 选择提现方式
    const wechatRadio = getByText('微信钱包')
    fireEvent.click(wechatRadio)
    
    // 提交表单
    const submitButton = getByText('申请提现')
    fireEvent.click(submitButton)
    
    await waitFor(() => {
      expect(require('@tarojs/taro').showToast).toHaveBeenCalledWith({
        title: '提现金额超过可用余额',
        icon: 'error'
      })
    })
  })

  test('应该验证支付宝账户信息完整性', async () => {
    const { getByPlaceholderText, getByText } = render(<DealerWithdraw />)
    
    // 输入有效金额
    const amountInput = getByPlaceholderText('请输入提现金额')
    fireEvent.change(amountInput, { target: { value: '1000' } })
    
    // 选择支付宝提现
    const alipayRadio = getByText('支付宝')
    fireEvent.click(alipayRadio)
    
    // 只填写账号，不填写姓名
    const accountInput = getByPlaceholderText('请输入支付宝账号')
    fireEvent.change(accountInput, { target: { value: 'test@alipay.com' } })
    
    // 提交表单
    const submitButton = getByText('申请提现')
    fireEvent.click(submitButton)
    
    await waitFor(() => {
      expect(require('@tarojs/taro').showToast).toHaveBeenCalledWith({
        title: '请填写完整的支付宝信息',
        icon: 'error'
      })
    })
  })

  test('应该成功提交微信提现申请', async () => {
    mockAddShopDealerWithdraw.mockResolvedValue('success')
    
    const { getByPlaceholderText, getByText } = render(<DealerWithdraw />)
    
    // 输入有效金额
    const amountInput = getByPlaceholderText('请输入提现金额')
    fireEvent.change(amountInput, { target: { value: '1000' } })
    
    // 选择微信提现
    const wechatRadio = getByText('微信钱包')
    fireEvent.click(wechatRadio)
    
    // 提交表单
    const submitButton = getByText('申请提现')
    fireEvent.click(submitButton)
    
    await waitFor(() => {
      expect(mockAddShopDealerWithdraw).toHaveBeenCalledWith({
        userId: 123,
        money: '1000',
        payType: 10,
        applyStatus: 10,
        platform: 'MiniProgram'
      })
    })
    
    await waitFor(() => {
      expect(require('@tarojs/taro').showToast).toHaveBeenCalledWith({
        title: '提现申请已提交',
        icon: 'success'
      })
    })
  })

  test('快捷金额按钮应该正常工作', () => {
    const { getByText, getByPlaceholderText } = render(<DealerWithdraw />)
    
    // 点击快捷金额按钮
    const quickAmountButton = getByText('500')
    fireEvent.click(quickAmountButton)
    
    // 验证金额输入框的值
    const amountInput = getByPlaceholderText('请输入提现金额') as HTMLInputElement
    expect(amountInput.value).toBe('500')
  })

  test('全部按钮应该设置为可用余额', () => {
    const { getByText, getByPlaceholderText } = render(<DealerWithdraw />)
    
    // 点击全部按钮
    const allButton = getByText('全部')
    fireEvent.click(allButton)
    
    // 验证金额输入框的值
    const amountInput = getByPlaceholderText('请输入提现金额') as HTMLInputElement
    expect(amountInput.value).toBe('10000.00')
  })
})
