import { describe, expect, it, vi } from 'vitest'
import { fireEvent, render, screen, waitFor } from '@testing-library/react'
import type { FieldsRevision, FieldsRevisionDiff } from '@platform-modules/fields'
import { FieldValidationSummary, FieldsRevisionDiffView, FieldsRevisionRestorePanel } from './revision-ui.js'

const revision:FieldsRevision={id:'r1',ref:{entityType:'content',entityId:'e1'},parentRevisionId:'parent-r1',kind:'revision',definitionVersions:{profile:2},values:{profile:{title:'Old'}},createdAt:new Date('2026-08-22T00:00:00Z'),createdBy:'editor-1',sourceVersion:'7'}
const diff:FieldsRevisionDiff={valuePaths:[{path:['profile','title'],kind:'changed'}],blockNodes:[{nodeId:'hero-1',kind:'moved'}]}

describe('revision and validation React surfaces',()=>{
  it('renders structural revision diff paths and block node changes',()=>{
    render(<FieldsRevisionDiffView diff={diff}/>)
    expect(screen.getByText('profile › title')).toBeTruthy()
    expect(screen.getByText('hero-1')).toBeTruthy()
    expect(screen.getAllByText('changed').length).toBeGreaterThan(0)
  })

  it('requires explicit confirmation before restore and announces completion',async()=>{
    const onRestore=vi.fn(async()=>{})
    render(<FieldsRevisionRestorePanel revision={revision} diff={diff} onRestore={onRestore}/>)
    const button=screen.getByRole('button',{name:'Restore revision'}) as HTMLButtonElement
    expect(button.disabled).toBe(true)
    fireEvent.click(screen.getByRole('checkbox'))
    expect(button.disabled).toBe(false)
    fireEvent.click(button)
    await waitFor(()=>expect(onRestore).toHaveBeenCalledWith(revision))
    expect(screen.getByRole('status').textContent).toMatch(/restored/i)
    expect(screen.getByText(/Password credentials are not restored/)).toBeTruthy()
  })

  it('links validation summary items to exact field paths',()=>{
    render(<FieldValidationSummary issues={[{path:['profile','title'],message:'Required'}]} idPrefix="edit"/>)
    const link=screen.getByRole('link',{name:/profile.*title.*Required/})
    expect(link.getAttribute('href')).toBe('#edit-profile__title')
  })
})
