import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { render, screen } from '@testing-library/react';
import { describe, expect, it, vi } from 'vitest';
import { ValuationForm } from '../valuation-form';

// Mock @hookform/resolvers/zod
vi.mock('@hookform/resolvers/zod', () => ({
  zodResolver: () => vi.fn(),
}));

// Mock useProjectSearch hook used by ValuationForm
vi.mock('@/lib/hooks/use-valuation', () => ({
  useProjectSearch: () => ({ data: [], isLoading: false }),
}));

// Mock valuation validation
vi.mock('@/lib/validations/valuation', () => ({
  valuationFormSchema: {},
  VALUATION_PROPERTY_TYPES: [
    { value: 'APARTMENT', label: 'Căn hộ' },
    { value: 'HOUSE', label: 'Nhà riêng' },
    { value: 'VILLA', label: 'Biệt thự' },
    { value: 'LAND', label: 'Đất nền' },
  ],
  CITIES: [
    { value: 'Ho Chi Minh', label: 'Hồ Chí Minh' },
    { value: 'Ha Noi', label: 'Hà Nội' },
    { value: 'Da Nang', label: 'Đà Nẵng' },
  ],
  FLOOD_RISK_OPTIONS: [
    { value: '0', label: 'An toàn' },
    { value: '0.5', label: 'Trung bình' },
    { value: '1', label: 'Rất cao' },
  ],
  QUALITY_LABELS: {
    renovationScore: 'Mức độ cải tạo',
    viewQuality: 'Chất lượng view',
    interiorQuality: 'Nội thất',
    noiseLevel: 'Mức ồn',
    naturalLight: 'Ánh sáng tự nhiên',
  },
}));

function createWrapper() {
  const queryClient = new QueryClient({
    defaultOptions: { queries: { retry: false } },
  });
  return function Wrapper({ children }: { children: React.ReactNode }) {
    return <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>;
  };
}

describe('ValuationForm', () => {
  it('renders form title', () => {
    render(<ValuationForm onSubmit={vi.fn()} />, { wrapper: createWrapper() });
    expect(screen.getByText('Định giá bất động sản')).toBeInTheDocument();
  });

  it('renders property type select', () => {
    render(<ValuationForm onSubmit={vi.fn()} />, { wrapper: createWrapper() });
    expect(screen.getByLabelText('Loại bất động sản *')).toBeInTheDocument();
  });

  it('renders city select', () => {
    render(<ValuationForm onSubmit={vi.fn()} />, { wrapper: createWrapper() });
    expect(screen.getByLabelText('Tỉnh/Thành phố *')).toBeInTheDocument();
  });

  it('renders district input', () => {
    render(<ValuationForm onSubmit={vi.fn()} />, { wrapper: createWrapper() });
    expect(screen.getByLabelText('Quận/Huyện *')).toBeInTheDocument();
  });

  it('renders area input', () => {
    render(<ValuationForm onSubmit={vi.fn()} />, { wrapper: createWrapper() });
    expect(screen.getByLabelText('Diện tích (m²) *')).toBeInTheDocument();
  });

  it('renders bedroom, bathroom, floors inputs', () => {
    render(<ValuationForm onSubmit={vi.fn()} />, { wrapper: createWrapper() });
    expect(screen.getByLabelText('Phòng ngủ')).toBeInTheDocument();
    expect(screen.getByLabelText('Phòng tắm')).toBeInTheDocument();
    expect(screen.getByLabelText('Số tầng')).toBeInTheDocument();
  });

  it('renders frontage and road width inputs', () => {
    render(<ValuationForm onSubmit={vi.fn()} />, { wrapper: createWrapper() });
    expect(screen.getByLabelText('Mặt tiền (m)')).toBeInTheDocument();
    expect(screen.getByLabelText('Độ rộng đường (m)')).toBeInTheDocument();
  });

  it('renders year built input', () => {
    render(<ValuationForm onSubmit={vi.fn()} />, { wrapper: createWrapper() });
    expect(screen.getByLabelText('Năm xây dựng')).toBeInTheDocument();
  });

  it('renders legal paper checkbox', () => {
    render(<ValuationForm onSubmit={vi.fn()} />, { wrapper: createWrapper() });
    expect(screen.getByLabelText('Có sổ đỏ/giấy tờ hợp pháp')).toBeInTheDocument();
  });

  it('renders submit button', () => {
    render(<ValuationForm onSubmit={vi.fn()} />, { wrapper: createWrapper() });
    expect(screen.getByText('Định giá ngay')).toBeInTheDocument();
  });

  it('shows loading text when isLoading', () => {
    render(<ValuationForm onSubmit={vi.fn()} isLoading={true} />, { wrapper: createWrapper() });
    expect(screen.getByText('Đang định giá...')).toBeInTheDocument();
  });

  it('disables submit button when loading', () => {
    render(<ValuationForm onSubmit={vi.fn()} isLoading={true} />, { wrapper: createWrapper() });
    expect(screen.getByText('Đang định giá...')).toBeDisabled();
  });

  it('renders property type options', () => {
    render(<ValuationForm onSubmit={vi.fn()} />, { wrapper: createWrapper() });
    expect(screen.getByText('Căn hộ')).toBeInTheDocument();
    expect(screen.getByText('Nhà riêng')).toBeInTheDocument();
  });

  it('renders city options', () => {
    render(<ValuationForm onSubmit={vi.fn()} />, { wrapper: createWrapper() });
    expect(screen.getByText('Hồ Chí Minh')).toBeInTheDocument();
    expect(screen.getByText('Hà Nội')).toBeInTheDocument();
  });

  it('renders description text', () => {
    render(<ValuationForm onSubmit={vi.fn()} />, { wrapper: createWrapper() });
    expect(screen.getByText(/Nhập thông tin bất động sản để nhận ước tính giá từ AI/)).toBeInTheDocument();
  });
});
