package com.magistr.app.controller;

import com.magistr.app.dto.ScheduleOverrideDto;
import com.magistr.app.service.ScheduleConflictException;
import com.magistr.app.service.ScheduleOverrideService;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.setup.MockMvcBuilders.standaloneSetup;

class ScheduleOverrideControllerTest {

    private ScheduleOverrideService service;
    private MockMvc mockMvc;

    @BeforeEach
    void setUp() {
        service = mock(ScheduleOverrideService.class);
        mockMvc = standaloneSetup(new ScheduleOverrideController(service))
                .setControllerAdvice(new GlobalExceptionHandler())
                .build();
    }

    @Test
    void returnsConflictWithRussianMessageForScheduleConflict() throws Exception {
        when(service.create(any(ScheduleOverrideDto.class))).thenThrow(new ScheduleConflictException(
                "Конфликт расписания: преподаватель уже занят в указанное время"
        ));

        mockMvc.perform(post("/api/edu-office/schedule/overrides")
                        .contentType(MediaType.APPLICATION_JSON)
                        .content("""
                                {
                                  "baseRuleSlotId": 101,
                                  "lessonDate": "2026-09-01",
                                  "action": "MOVE",
                                  "newTimeSlotId": 2
                                }
                                """))
                .andExpect(status().isConflict())
                .andExpect(jsonPath("$.status").value(409))
                .andExpect(jsonPath("$.error").value("Конфликт"))
                .andExpect(jsonPath("$.message")
                        .value("Конфликт расписания: преподаватель уже занят в указанное время"));
    }
}
