import { mount } from '@vue/test-utils';

import { describe, expect, it } from 'vitest';

import AiPromptInput from './AiPromptInput.vue';

describe('AiPromptInput', () => {
  it('emits send when loading is false', async () => {
    const wrapper = mount(AiPromptInput, {
      props: {
        loading: false,
        modelValue: '',
      },
    });

    await wrapper.find('textarea').setValue('你好');
    await wrapper.setProps({ modelValue: '你好' });
    await wrapper.find('[aria-label="发送"]').trigger('click');

    expect(wrapper.emitted('send')?.[0]?.[0]).toBe('你好');
  });

  it('emits stop when loading is true', async () => {
    const wrapper = mount(AiPromptInput, {
      props: {
        loading: true,
      },
    });

    expect(wrapper.find('[aria-label="中止"]').exists()).toBe(true);
    await wrapper.find('[aria-label="中止"]').trigger('click');

    expect(wrapper.emitted('stop')).toBeTruthy();
  });

  it('supports sending a ready image without text', async () => {
    const wrapper = mount(AiPromptInput, {
      props: {
        images: [
          {
            localId: 'image-1',
            mimeType: 'image/png',
            name: 'test.png',
            previewUrl: 'data:image/png;base64,AA==',
            size: 1,
            status: 'ready',
            uploadId: 'upload-1',
          },
        ],
        loading: false,
      },
    });

    await wrapper.find('[aria-label="发送"]').trigger('click');

    expect(wrapper.emitted('send')?.[0]?.[0]).toBe('');
  });

  it('extracts image files from clipboard paste', async () => {
    const wrapper = mount(AiPromptInput, {
      props: {
        loading: false,
      },
    });
    const image = new File(['image'], 'pasted.png', { type: 'image/png' });
    const event = new Event('paste', { bubbles: true, cancelable: true });
    Object.defineProperty(event, 'clipboardData', {
      value: { files: [image] },
    });

    wrapper.find('textarea').element.dispatchEvent(event);
    await wrapper.vm.$nextTick();

    expect(event.defaultPrevented).toBe(true);
    expect(wrapper.emitted('addFiles')?.[0]?.[0]).toEqual([image]);
  });

  it('extracts image files from drop', async () => {
    const wrapper = mount(AiPromptInput, {
      props: {
        loading: false,
      },
    });
    const image = new File(['image'], 'dropped.jpg', { type: 'image/jpeg' });
    const text = new File(['text'], 'note.txt', { type: 'text/plain' });

    await wrapper.find('.ai-prompt-input').trigger('drop', {
      dataTransfer: { files: [image, text] },
    });

    expect(wrapper.emitted('addFiles')?.[0]?.[0]).toEqual([image]);
  });
});
