import { act, renderHook } from '@testing-library/react'
import { ACCOUNT_SETTING_TAB } from '../constants'
import { useIntegrationsSetting } from '../use-integrations-setting'

const { mockSetShowAccountSettingModal } = vi.hoisted(() => ({
  mockSetShowAccountSettingModal: vi.fn(),
}))

vi.mock('@/context/modal-context', () => ({
  useModalContext: () => ({
    setShowAccountSettingModal: mockSetShowAccountSettingModal,
  }),
}))

describe('useIntegrationsSetting', () => {
  beforeEach(() => {
    vi.clearAllMocks()
  })

  it.each([
    [ACCOUNT_SETTING_TAB.PROVIDER, 'provider'],
    [ACCOUNT_SETTING_TAB.DATA_SOURCE, 'data-source'],
    [ACCOUNT_SETTING_TAB.API_BASED_EXTENSION, 'custom-endpoint'],
  ])('should open integrations settings for migrated tab %s', (tab, section) => {
    const { result } = renderHook(() => useIntegrationsSetting())

    act(() => {
      result.current({ payload: tab })
    })

    expect(mockSetShowAccountSettingModal).toHaveBeenCalledWith({ payload: section })
  })

  it('should open integrations settings from a direct section', () => {
    const { result } = renderHook(() => useIntegrationsSetting())

    act(() => {
      result.current({ section: 'mcp' })
    })

    expect(mockSetShowAccountSettingModal).toHaveBeenCalledWith({ payload: 'mcp' })
  })

  it('should preserve the agent source for agent-scoped settings', () => {
    const { result } = renderHook(() => useIntegrationsSetting())

    act(() => {
      result.current({ payload: ACCOUNT_SETTING_TAB.PROVIDER, source: 'agent' })
    })

    expect(mockSetShowAccountSettingModal).toHaveBeenCalledWith({
      payload: 'provider',
      source: 'agent',
    })
  })

  it('should preserve the cancel callback for migrated integrations settings', () => {
    const onCancelCallback = vi.fn()
    const { result } = renderHook(() => useIntegrationsSetting())

    act(() => {
      result.current({ payload: ACCOUNT_SETTING_TAB.PROVIDER, onCancelCallback })
    })

    expect(mockSetShowAccountSettingModal).toHaveBeenCalledWith({
      payload: 'provider',
      onCancelCallback,
    })
  })
})
