@DataJpaTest
public class KundeRepositoryTest {

    @Autowired
    private KundeRepository kundeRepository;


    @Test
    void findBestellungByKundeId(){
        Kunde kunde = new Kunde();
        kunde.setId(1L);
        kunde.setVorname("Max");
        kunde.setNachname("Mustermann");
        kunde.setEmail("[email protected]");
        kunde.setAlter(39);


        Bestellung b1 = new Bestellung();
        b1.setId(1L);
        b1.setBestelldatum("28-05-2025");
        b1.setBetrag(10.0);
        b1.setKunde(kunde);

        Bestellung b2 = new Bestellung();
        b1.setId(2L);
        b2.setBestelldatum("30-05-2025");
        b2.setBetrag(20.0);
        b2.setKunde(kunde);

        kunde.setBestellungList(List.of(b1,b2));
        kundeRepository.save(kunde);

        List bestellungs = kundeRepository.findBestellungenByKundeId(kunde.getId());
        assertEquals(2, bestellungs.size());
    }
@ExtendWith(MockitoExtension.class)
public class KundeServiceTest {

    @Mock
    private KundeRepository kundeRepository;
    private KundeCriteriaRepository kundeCriteriaRepository;

    @InjectMocks
    private KundeService kundeService;

    @Test
    void testGetAllKunde() {
        List kundeList = List.of(
                new Kunde(1L, "Anna", "Meier", 28, "[email protected]", null),
                new Kunde(2L, "Tom", "Muster", 38, "[email protected]", null)
        );

        when(kundeRepository.findAll()).thenReturn(kundeList);

        List result = kundeService.getAllKunde();
        assertEquals(2, result.size());
        assertEquals("Anna", result.get(0).vorname());
    }

    @Test
    void testAddKunde() {
        Bestellung bestellung = new Bestellung();
        KundeDto dto = new KundeDto(null, "Lisa", "Huber", "[email protected]", 30, List.of(bestellung));

        Kunde gespeicherterKunde = new Kunde(1L, "Lisa", "Huber", 30, "[email protected]", List.of(bestellung));
        when(kundeRepository.save(org.mockito.ArgumentMatchers.any(Kunde.class))).thenReturn(gespeicherterKunde);

        Kunde result = kundeService.addKunde(dto);

        assertEquals("Lisa", result.getVorname());
    }

    @Test
    void testGetKundeById() {
        Kunde kunde = new Kunde(1L, "Max", "Muster", 40, "[email protected]", null);
        when(kundeRepository.findById(1L)).thenReturn(java.util.Optional.of(kunde));

        KundeDto dto = kundeService.getKundeById(1L);

        assertEquals("Max", dto.vorname());
        assertEquals("Muster", dto.nachname());
        assertEquals(40, dto.alter());
        assertEquals(null, dto.email());
    }

    @Test
    void testGetKundeByCriteria() {
        Kunde kunde = new Kunde(1L, "Sarah", "Winter", 25, "[email protected]", null);
        when(kundeCriteriaRepository.getKundeByCriteria(org.mockito.ArgumentMatchers.any()))
                .thenReturn(List.of(kunde));

        KundeDto criteria = new KundeDto(null, "Sarah", "Winter", "[email protected]", 25, null);
        List result = kundeService.getKundeByCriteria(criteria);

        assertEquals(1, result.size());
    }
}
@WebMvcTest(controllers = KundeController.class)
@AutoConfigureMockMvc(addFilters = false)
public class KundeControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private KundeService kundeService;

    @Autowired
    private ObjectMapper objectMapper;


    @Test
    void getAllKunde() throws Exception{
        KundeDto kundeDto = new KundeDto(1L, "Tibor", "Focu", null, 45, null);
        KundeDto kundeDto2 = new KundeDto(2L, "Lady", "Gaga", null, 43, null);

        List kundeDtoList = Arrays.asList(kundeDto, kundeDto2);


        when(kundeService.getAllKunde()).thenReturn(kundeDtoList);

        ResultActions result = mockMvc.perform(get("/kunde")
                .contentType(MediaType.APPLICATION_JSON));

        result.andExpect(status().isOk())
                .andExpect(jsonPath("$[0].vorname", CoreMatchers.is("Tibor")))
                .andExpect(jsonPath("$[1].vorname", CoreMatchers.is("Lady")));

    }


}
@Repository
public class KundeCriteriaRepository {

    @Autowired
private EntityManager entityManager;

    public List getKundeByCriteria(Kunde kunde){
        CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
        CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Kunde.class);
        Root kundeRoot = criteriaQuery.from(Kunde.class);

        Predicate vornamePredicate = criteriaBuilder.like(kundeRoot.get("vorname"), kunde.getVorname());
        Predicate nachnamePredicate = criteriaBuilder.like(kundeRoot.get("nachname"), kunde.getNachname());
        Predicate alterPredicate = criteriaBuilder.equal(kundeRoot.get("alter"), kunde.getAlter());
        Predicate vornameAndAlterPredicate = criteriaBuilder.and(vornamePredicate, alterPredicate);
        Predicate nachnameAndAlterPredicate = criteriaBuilder.and(nachnamePredicate, alterPredicate);
        Predicate orPredicate = criteriaBuilder.or(vornameAndAlterPredicate, nachnameAndAlterPredicate);
        criteriaQuery.where(orPredicate);
        return entityManager.createQuery(criteriaQuery).getResultList();
    }


}