import { test, expect } from '@playwright/test';

test.describe('로그인 기능 테스트 (Razor Pages)', () => {
  test.beforeEach(async ({ page }) => {
    // 로그인 페이지로 이동
    await page.goto('/Account/Login');
    // 페이지 로딩 대기
    await page.waitForLoadState('domcontentloaded');
  });

  test('로그인 페이지 렌더링 확인', async ({ page }) => {
    // 페이지 타이틀 확인
    await expect(page).toHaveTitle(/로그인/);

    // 입력 필드 확인 (ID 기반 셀렉터)
    const usernameInput = page.locator('#username');
    const passwordInput = page.locator('#password');
    const loginButton = page.locator('#loginBtn');

    await expect(usernameInput).toBeVisible();
    await expect(passwordInput).toBeVisible();
    await expect(loginButton).toBeVisible();

    console.log('✓ 로그인 페이지 렌더링 완료');
  });

  test('입력 필드에 텍스트 입력 가능 확인', async ({ page }) => {
    // 아이디 입력
    const usernameInput = page.locator('#username');
    await usernameInput.click();
    await usernameInput.type('admin', { delay: 50 });

    // 비밀번호 입력
    const passwordInput = page.locator('#password');
    await passwordInput.click();
    await passwordInput.type('test123', { delay: 50 });

    // 입력값 확인
    const usernameValue = await usernameInput.inputValue();
    const passwordValue = await passwordInput.inputValue();

    expect(usernameValue).toBe('admin');
    expect(passwordValue).toBe('test123');

    console.log('✓ 입력 필드 동작 확인');
  });

  test('로그인 버튼 클릭 가능 확인', async ({ page }) => {
    // 아이디 입력
    const usernameInput = page.locator('#username');
    await usernameInput.click();
    await usernameInput.type('admin', { delay: 50 });

    // 비밀번호 입력
    const passwordInput = page.locator('#password');
    await passwordInput.click();
    await passwordInput.type('admin', { delay: 50 });

    // 로그인 버튼 클릭
    const loginButton = page.locator('#loginBtn');
    await loginButton.click();

    console.log('✓ 로그인 버튼 클릭 가능');

    // 페이지 변화 대기
    await page.waitForLoadState('domcontentloaded');
  });

  test('로그인 실패 시 오류 메시지 표시', async ({ page }) => {
    // 잘못된 자격증명 입력
    const usernameInput = page.locator('#username');
    const passwordInput = page.locator('#password');
    const loginButton = page.locator('#loginBtn');

    await usernameInput.fill('invaliduser');
    await passwordInput.fill('wrongpassword');
    await loginButton.click();

    // 오류 메시지 대기 (alert-error 클래스)
    const errorAlert = page.locator('.alert-error');
    await expect(errorAlert).toBeVisible({ timeout: 5000 });

    console.log('✓ 로그인 실패 오류 메시지 표시 확인');
  });

  test('보호된 페이지 접근 시 로그인 페이지로 리다이렉트', async ({ page }) => {
    // 관리자 대시보드 직접 접근 시도
    await page.goto('/Admin/Dashboard', { waitUntil: 'domcontentloaded' });

    // 로그인 페이지로 리다이렉트 되어야 함
    const currentUrl = page.url();
    expect(currentUrl).toContain('/Account/Login');

    console.log('✓ 보호된 페이지 접근 제어 확인');
  });

  test('전체 로그인 플로우 테스트', async ({ page }) => {
    console.log('\n=== 전체 로그인 플로우 테스트 ===');

    // 1단계: 로그인 페이지 확인
    console.log('1️⃣  로그인 페이지 확인...');
    await expect(page).toHaveTitle(/로그인/);

    // 2단계: 입력 필드 찾기
    console.log('2️⃣  입력 필드 찾기...');
    const usernameInput = page.locator('#username');
    const passwordInput = page.locator('#password');
    const loginButton = page.locator('#loginBtn');

    await expect(usernameInput).toBeVisible();
    await expect(passwordInput).toBeVisible();
    await expect(loginButton).toBeVisible();

    // 3단계: 로그인 정보 입력
    console.log('3️⃣  로그인 정보 입력...');
    await usernameInput.fill('admin');
    await passwordInput.fill('admin');

    // 4단계: 로그인 버튼 클릭
    console.log('4️⃣  로그인 버튼 클릭...');
    await loginButton.click();

    // 5단계: 페이지 변화 대기
    console.log('5️⃣  페이지 변화 대기...');
    await page.waitForLoadState('domcontentloaded');

    // 6단계: 최종 상태 확인
    console.log('6️⃣  최종 상태 확인...');
    const finalUrl = page.url();
    const pageTitle = await page.title();

    console.log(`  최종 URL: ${finalUrl}`);
    console.log(`  페이지 타이틀: ${pageTitle}`);

    // 로그인 성공 시 로그인 페이지가 아닌 다른 페이지로 이동되어야 함
    expect(!finalUrl.includes('/Account/Login')).toBeTruthy();

    console.log('\n✓ 전체 로그인 플로우 테스트 완료');
  });
});
