package dev.fyloz.trial.colorrecipesexplorer.service.model;

import dev.fyloz.trial.colorrecipesexplorer.exception.model.EntityAlreadyExistsException;
import dev.fyloz.trial.colorrecipesexplorer.exception.model.EntityLinkedException;
import dev.fyloz.trial.colorrecipesexplorer.exception.model.ModelException;
import dev.fyloz.trial.colorrecipesexplorer.model.Company;
import dev.fyloz.trial.colorrecipesexplorer.service.AbstractJavaService;
import dev.fyloz.trial.colorrecipesexplorer.repository.CompanyRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;

import javax.validation.constraints.NotNull;

@Service
public class CompanyService extends AbstractJavaService<Company, CompanyRepository> {

    private RecipeService recipeService;

    public CompanyService() {
        super(Company.class);
    }

    @Autowired
    public void setCompanyDao(CompanyRepository companyRepository) {
        this.repository = companyRepository;
    }

    // Pour éviter les dépendances circulaires
    @Autowired
    @Lazy
    public void setRecipeService(RecipeService recipeService) {
        this.recipeService = recipeService;
    }

    /**
     * Vérifie si une bannière correspondant à un nom existe.
     *
     * @param name Le nom de la bannière
     * @return Si une bannière correspondant au nome existe
     */
    public boolean existsByName(String name) {
        return repository.existsByName(name);
    }

    /**
     * Vérifie si une bannière est liée à une recette.
     *
     * @param company La bannière
     * @return Si la bannière est liée à une recette
     */
    public boolean isLinkedToRecipes(Company company) {
        return recipeService.existsByCompany(company);
    }

    @Override
    public Company save(@NotNull Company entity) {
        if (existsByName(entity.getName()))
            throw new EntityAlreadyExistsException(type, ModelException.IdentifierType.NAME, entity.getName());

        return super.save(entity);
    }

    @Override
    public void delete(Company entity) {
        if (isLinkedToRecipes(entity)) throw new EntityLinkedException(type);

        super.delete(entity);
    }

    @Deprecated(since = "1.3.0", forRemoval = true)
    public void deleteIfNotLinked(Company company) {
        if (!isLinkedToRecipes(company)) delete(company);
    }
}
