package gohigher.application;

import static org.assertj.core.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.*;

import java.time.LocalDateTime;
import java.util.List;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.test.context.TestConstructor;

import gohigher.application.entity.ApplicationJpaEntity;
import gohigher.application.entity.ApplicationProcessRepository;
import gohigher.application.entity.ApplicationRepository;
import gohigher.common.EmploymentType;
import gohigher.common.Process;
import gohigher.common.ProcessType;
import lombok.RequiredArgsConstructor;

@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL)
@RequiredArgsConstructor
@DataJpaTest
class ApplicationPersistenceAdapterTest {

	private final ApplicationPersistenceAdapter applicationPersistenceAdapter;
	private final ApplicationRepository applicationRepository;
	private final ApplicationProcessRepository applicationProcessRepository;

	@DisplayName("개인 지원서를 저장한다")
	@Test
	void saveApplication() {
		Application application = generateApplication();
		long userId = 1L;

		Long applicationId = applicationPersistenceAdapter.save(userId, application);

		ApplicationJpaEntity applicationJpaEntity = applicationRepository.findById(applicationId).orElseThrow();

		assertAll(
			() -> assertThat(applicationJpaEntity.getUserId()).isEqualTo(userId),
			() -> assertThat(applicationJpaEntity.getProcesses()).hasSize(4)
		);
	}

	private Application generateApplication() {
		List<Process> processes = generateProcesses();
		Process currentProcess = processes.get(0);
		return new Application("고하이어 컴퍼니", "서울특별시 강남구", "010-0000-0000", "백엔드 개발", "JD", "재택 근무",
			EmploymentType.PERMANENT, "careerRequirement", "requiredCapability", "preferredQualification",
			LocalDateTime.now().plusDays(7), processes, "url", currentProcess);
	}

	private List<Process> generateProcesses() {
		return List.of(new Process(ProcessType.TO_APPLY, null, LocalDateTime.now().plusDays(10)),
			new Process(ProcessType.TEST, null, null),
			new Process(ProcessType.INTERVIEW, null, null),
			new Process(ProcessType.COMPLETE, null, null)
		);
	}
}