package io.delphiplatform.api.v3.rdb.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

import io.delphiplatform.api.util.OffsetBasedPageRequest;
import io.delphiplatform.api.v3.model.gras.Company;
import io.delphiplatform.api.v3.rdb.entity.CompanyEntity;
import io.delphiplatform.api.v3.rdb.repository.CompanyRepository;
import io.delphiplatform.api.v3.rdb.service.specification.SpecificationProvider;
import io.delphiplatform.api.v3.view.util.Params;

@Service
@Transactional(readOnly = true)
public class CompanyService extends EntityService<CompanyEntity> {

    private final CompanyRepository companyRepository;
    private final SpecificationProvider<CompanyEntity> specificationProvider;

    @Autowired
    public CompanyService(CompanyRepository companyRepository,
        SpecificationProvider<CompanyEntity> specificationProvider) {
        super(companyRepository);
        this.specificationProvider = specificationProvider;
        this.companyRepository = companyRepository;
    }


    public Company findOne(String companyKey) {
        return companyRepository.findById(companyKey)
            .map(Company::from)
            .orElseThrow(NOT_FOUND);
    }

    public List<Company> find(Params params) {
        Specification<CompanyEntity> specification = and(Collections.singletonList(
            specificationProvider.multiValueSpec("companyKey", params.getCompanyKeys())
        ));

        return find(specification, OffsetBasedPageRequest.ofParamsToCamelCase(params))
            .stream()
            .map(Company::from)
            .collect(Collectors.toList());
    }
}
