import { renderHook } from '@testing-library/react';

import { usePage } from '@inertiajs/react';

import type { SiteSummary } from '@/types';

import { useSiteScope } from './useSiteScope';

vi.mock('@inertiajs/react', () => ({
  usePage: vi.fn(),
}));

function makeSite(overrides: Partial<SiteSummary> = {}): SiteSummary {
  return {
    id: 1,
    name: 'Test Site',
    domain: 'example.com',
    has_gsc: true,
    gsc_synced: true,
    has_wp: true,
    wp_connected: true,
    has_analysis: false,
    has_ai_key: false,
    current_role: 'owner',
    has_reviewed_recommendation: false,
    ai_available: false,
    ...overrides,
  };
}

function mockUsePage(sites: SiteSummary[]) {
  vi.mocked(usePage).mockReturnValue({
    props: { sites },
  } as unknown as ReturnType<typeof usePage>);
}

describe('useSiteScope', () => {
  it('returns null site when sites array is empty', () => {
    mockUsePage([]);
    const { result } = renderHook(() => useSiteScope());
    expect(result.current.site).toBeNull();
    expect(result.current.siteId).toBeNull();
    expect(result.current.canEdit).toBe(false);
    expect(result.current.canAdmin).toBe(false);
  });

  it('returns first site when available', () => {
    const site = makeSite({ id: 42, name: 'My Blog' });
    mockUsePage([site]);
    const { result } = renderHook(() => useSiteScope());
    expect(result.current.site).toEqual(site);
    expect(result.current.siteId).toBe(42);
  });

  it('canEdit is true for owner role', () => {
    mockUsePage([makeSite({ current_role: 'owner' })]);
    const { result } = renderHook(() => useSiteScope());
    expect(result.current.canEdit).toBe(true);
  });

  it('canEdit is true for admin role', () => {
    mockUsePage([makeSite({ current_role: 'admin' })]);
    const { result } = renderHook(() => useSiteScope());
    expect(result.current.canEdit).toBe(true);
  });

  it('canEdit is true for editor role', () => {
    mockUsePage([makeSite({ current_role: 'editor' })]);
    const { result } = renderHook(() => useSiteScope());
    expect(result.current.canEdit).toBe(true);
  });

  it('canEdit is false for viewer role', () => {
    mockUsePage([makeSite({ current_role: 'viewer' })]);
    const { result } = renderHook(() => useSiteScope());
    expect(result.current.canEdit).toBe(false);
  });

  it('canAdmin is true for owner role', () => {
    mockUsePage([makeSite({ current_role: 'owner' })]);
    const { result } = renderHook(() => useSiteScope());
    expect(result.current.canAdmin).toBe(true);
  });

  it('canAdmin is true for admin role', () => {
    mockUsePage([makeSite({ current_role: 'admin' })]);
    const { result } = renderHook(() => useSiteScope());
    expect(result.current.canAdmin).toBe(true);
  });

  it('canAdmin is false for editor role', () => {
    mockUsePage([makeSite({ current_role: 'editor' })]);
    const { result } = renderHook(() => useSiteScope());
    expect(result.current.canAdmin).toBe(false);
  });

  it('canAdmin is false for viewer role', () => {
    mockUsePage([makeSite({ current_role: 'viewer' })]);
    const { result } = renderHook(() => useSiteScope());
    expect(result.current.canAdmin).toBe(false);
  });
});
