package com.server.api.service.flaechendruck;

import com.server.api.models.Coordinates;
import com.server.api.models.VorlageFlaechendruck;
import com.server.api.repository.CoordinatesRepository;
import com.server.api.repository.VorlageFlaechendruckRepository;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class VorlageFlaechendruckService {

  @Autowired private VorlageFlaechendruckRepository vorlageFlaechendruckRepository;

  @Autowired private CoordinatesRepository coordinatesRepository;

  @Transactional
  public void deleteVorlageFlaechendruck(Long id) {
    coordinatesRepository.deleteByVorlageId(id);
    vorlageFlaechendruckRepository.deleteById(id);
  }

  public void saveVorlageWithCoordinates(VorlageFlaechendruck vorlageDTO) {
    // Erstellen der VorlageFlaechendruck-Entität
    VorlageFlaechendruck vorlage = new VorlageFlaechendruck();
    vorlage.setPrinter(vorlageDTO.getPrinter());
    vorlage.setProduct_type(vorlageDTO.getProduct_type());
    vorlage.setHeight(vorlageDTO.getHeight());
    vorlage.setWidth(vorlageDTO.getWidth());

    // Speichern der VorlageFlaechendruck-Entität
    VorlageFlaechendruck savedVorlage = vorlageFlaechendruckRepository.save(vorlage);

    // Speichern der zugehörigen Coordinates
    for (Coordinates coordinate : vorlageDTO.getCoordinates()) {
      coordinate.setVorlage(savedVorlage); // Fremdschlüssel setzen
      coordinatesRepository.save(coordinate);
    }

  }

  public void alterVorlage(VorlageFlaechendruck vorlage){
    VorlageFlaechendruck vorlageInDB = vorlageFlaechendruckRepository.findById(vorlage.getId()).get();
    vorlageInDB.setPrinter(vorlage.getPrinter());
    vorlageInDB.setProduct_type(vorlage.getProduct_type());
    vorlageInDB.setHeight(vorlage.getHeight());
    vorlageInDB.setWidth(vorlage.getWidth());

    List<Coordinates> coordinates = coordinatesRepository.findAll();
    List<Coordinates> coordinatesToDelete = new ArrayList<>();
    for (Coordinates coordinate : coordinates) {
      if (coordinate.getVorlage().getId() == vorlageInDB.getId()) {
        coordinatesToDelete.add(coordinate);
      }
    }
    coordinatesRepository.deleteAll(coordinatesToDelete);

    for (Coordinates coordinate : vorlage.getCoordinates()) {
      coordinate.setVorlage(vorlageInDB); // Fremdschlüssel setzen
      coordinatesRepository.save(coordinate);
    }

    vorlageFlaechendruckRepository.save(vorlageInDB);
  }

  public List<VorlageFlaechendruck> getAllVorlagen() {
    List<VorlageFlaechendruck> vorlagen = vorlageFlaechendruckRepository.findAll();
    List<Coordinates> coordinates = coordinatesRepository.findAll();

    List<VorlageFlaechendruck> vorlagenWithCoordinates = new ArrayList<>();
    for (VorlageFlaechendruck vorlage : vorlagen) {
      List<Coordinates> vorlageCoordinates = new ArrayList<>();
      for (Coordinates coordinate : coordinates) {
        if (coordinate.getVorlage().getId() == vorlage.getId()) {
          vorlageCoordinates.add(coordinate);
        }
      }
      vorlage.setCoordinates(vorlageCoordinates);
      vorlagenWithCoordinates.add(vorlage);
    }

    return vorlagenWithCoordinates;
  }

  public VorlageFlaechendruck getVorlageById(long id) {
    VorlageFlaechendruck vorlage = vorlageFlaechendruckRepository.findById(id).get();
    List<Coordinates> coordinates = coordinatesRepository.findAll();

    List<Coordinates> vorlageCoordinates = new ArrayList<>();
    for (Coordinates coordinate : coordinates) {
      if (coordinate.getVorlage().getId() == vorlage.getId()) {
        vorlageCoordinates.add(coordinate);
      }
    }
    vorlage.setCoordinates(vorlageCoordinates);

    return vorlage;
  }
}
