package com.kpaudel.service;

import com.kpaudel.model.ApplicationStatus;
import com.kpaudel.model.Company;
import com.kpaudel.model.JobApplication;
import com.kpaudel.model.User;
import com.kpaudel.repository.CompanyRepository;
import com.kpaudel.repository.JobApplicationRepository;
import com.kpaudel.repository.UserRepository;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.UUID;

@Service
public class JobService {
    private final JobApplicationRepository jobRepo;
    private final CompanyRepository companyRepo;
    private final UserRepository userRepo;

    public JobService(JobApplicationRepository jobRepo, CompanyRepository companyRepo, UserRepository userRepo) {
        this.jobRepo = jobRepo;
        this.companyRepo = companyRepo;
        this.userRepo = userRepo;
    }

    public JobApplication create(JobApplication data, UUID userId) {
        User user = this.userRepo.findById(userId).orElseThrow(() -> new IllegalArgumentException("User not found!"));
        data.setUser(user);
        Company company = this.companyRepo.findById(data.getCompany().getId()).orElseThrow(() -> new IllegalArgumentException("Company not found!"));
        data.setCompany(company);
        return jobRepo.save(data);
    }

    public JobApplication updateStatus(UUID id, ApplicationStatus status, UUID userId) {
        JobApplication job = this.jobRepo.findById(id).orElseThrow(() -> new IllegalArgumentException("Job not found"));
        if (!job.getUser().getId().equals(userId)) {
            throw new AccessDeniedException("You can only update your own jobs");
        }
        job.setStatus(status);
        return this.jobRepo.save(job);
    }

    public List<JobApplication> listAllByUser(UUID userId) {
        return this.jobRepo.findByUserId(userId);
    }

    public List<JobApplication> listByUserAndStatus(UUID userId, ApplicationStatus status) {
        return this.jobRepo.findByUserIdAndStatus(userId, status);
    }

    public List<JobApplication> listByCompanyAndUser(UUID companyId, UUID userId) {
        return this.jobRepo.findByUserIdAndCompanyId(userId, companyId);
    }
}
