package com.devjob.dto;

import com.devjob.domain.Job;
import com.devjob.domain.JobStatus;
import com.devjob.repository.JobSpecification;
import java.time.LocalDate;
import org.springframework.data.jpa.domain.Specification;

/**
 * EP27: GET /api/jobs/search 의 검색 조건.
 * - 모든 필드는 선택값(nullable)이며, 각 필드에 대응하는 JobSpecification이 null을 반환하면
 *   해당 조건은 자동으로 제외된다.
 * - keyword/location 2개뿐이던 EP14의 JPQL(searchJobs)과 달리, 조건이 늘어나도
 *   메서드를 추가하지 않고 Specification을 and()로 조합하기만 하면 된다.
 */
public record JobSearchRequest(
        String keyword,
        String location,
        JobStatus status,
        Integer minSalary,
        Integer maxSalary,
        LocalDate deadlineBefore
) {
    public Specification<Job> toSpecification() {
        return Specification.where(JobSpecification.withKeyword(keyword))
                .and(JobSpecification.withLocation(location))
                .and(JobSpecification.withStatus(status))
                .and(JobSpecification.withSalaryGoe(minSalary))
                .and(JobSpecification.withSalaryLoe(maxSalary))
                .and(JobSpecification.withDeadlineBefore(deadlineBefore));
    }
}
