import { describe, it, expect, vi, afterEach } from 'vitest'
import type { SessionShare } from '@/types'
import { buildSessionShareUrl, filterSharesForSession, getLatestActiveShareForSession } from './sessionShare'

function makeMockShare(overrides: Partial<SessionShare> = {}): SessionShare {
  return {
    id: 'share-1',
    session_id: 'session-1',
    account_id: 'account-1',
    share_token: 'abc123',
    share_name: null,
    visibility: 'public',
    created_by: 'user-1',
    created_at: '2026-02-14T10:00:00Z',
    updated_at: '2026-02-14T10:00:00Z',
    expires_at: null,
    view_count: 0,
    last_viewed_at: null,
    is_active: true,
    share_url: null,
    ...overrides,
  }
}

afterEach(() => {
  vi.unstubAllGlobals()
})

describe('buildSessionShareUrl', () => {
  it('returns share_url when present', () => {
    const share = makeMockShare({ share_url: 'https://resolutionflow.com/share/abc123' })
    expect(buildSessionShareUrl(share)).toBe('https://resolutionflow.com/share/abc123')
  })

  it('constructs URL from token when share_url is null', () => {
    vi.stubGlobal('location', { origin: 'http://localhost:5173' })
    const share = makeMockShare({ share_token: 'tok-xyz', share_url: null })
    expect(buildSessionShareUrl(share)).toBe('http://localhost:5173/share/tok-xyz')
  })
})

describe('filterSharesForSession', () => {
  it('filters to matching session_id and active shares', () => {
    const shares = [
      makeMockShare({ id: 's1', session_id: 'sess-A', is_active: true }),
      makeMockShare({ id: 's2', session_id: 'sess-B', is_active: true }),
      makeMockShare({ id: 's3', session_id: 'sess-A', is_active: true }),
    ]
    const result = filterSharesForSession(shares, 'sess-A')
    expect(result).toHaveLength(2)
    expect(result.map(s => s.id)).toEqual(['s1', 's3'])
  })

  it('excludes inactive shares', () => {
    const shares = [
      makeMockShare({ id: 's1', session_id: 'sess-A', is_active: true }),
      makeMockShare({ id: 's2', session_id: 'sess-A', is_active: false }),
    ]
    const result = filterSharesForSession(shares, 'sess-A')
    expect(result).toHaveLength(1)
    expect(result[0].id).toBe('s1')
  })
})

describe('getLatestActiveShareForSession', () => {
  it('returns the most recently created share', () => {
    const shares = [
      makeMockShare({ id: 'old', session_id: 'sess-A', created_at: '2026-02-10T10:00:00Z', is_active: true }),
      makeMockShare({ id: 'newest', session_id: 'sess-A', created_at: '2026-02-14T12:00:00Z', is_active: true }),
      makeMockShare({ id: 'mid', session_id: 'sess-A', created_at: '2026-02-12T10:00:00Z', is_active: true }),
    ]
    const result = getLatestActiveShareForSession(shares, 'sess-A')
    expect(result).not.toBeNull()
    expect(result!.id).toBe('newest')
  })

  it('returns null when no shares match', () => {
    const shares = [
      makeMockShare({ session_id: 'sess-B', is_active: true }),
      makeMockShare({ session_id: 'sess-A', is_active: false }),
    ]
    const result = getLatestActiveShareForSession(shares, 'sess-A')
    expect(result).toBeNull()
  })
})
