package com.magistr.app.controller;

import com.magistr.app.config.auth.RequireRoles;
import com.magistr.app.model.EducationForm;
import com.magistr.app.model.Role;
import com.magistr.app.model.StudentGroup;
import com.magistr.app.repository.AcademicCalendarRepository;
import com.magistr.app.repository.EducationFormRepository;
import com.magistr.app.repository.GroupRepository;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/api/education-forms")
@RequireRoles({Role.ADMIN, Role.EDUCATION_OFFICE})
public class EducationFormController {

    private final EducationFormRepository educationFormRepository;
    private final GroupRepository groupRepository;
    private final AcademicCalendarRepository academicCalendarRepository;

    public EducationFormController(EducationFormRepository educationFormRepository,
                                   GroupRepository groupRepository,
                                   AcademicCalendarRepository academicCalendarRepository) {
        this.educationFormRepository = educationFormRepository;
        this.groupRepository = groupRepository;
        this.academicCalendarRepository = academicCalendarRepository;
    }

    @GetMapping
    @RequireRoles({Role.ADMIN, Role.EDUCATION_OFFICE, Role.DEPARTMENT, Role.SCHEDULE_VIEWER})
    public List<Map<String, Object>> getAll() {
        return educationFormRepository.findAllByOrderByNameAsc().stream()
                .map(ef -> Map.<String, Object>of("id", ef.getId(), "name", ef.getName()))
                .toList();
    }

    @PostMapping
    public ResponseEntity<?> create(@RequestBody Map<String, String> body) {
        String name = body.get("name");
        if (name == null || name.isBlank()) {
            return ResponseEntity.badRequest().body(Map.of("message", "Название обязательно"));
        }
        name = name.trim();
        if (educationFormRepository.findByName(name).isPresent()) {
            return ResponseEntity.badRequest().body(Map.of("message", "Такая форма обучения уже существует"));
        }

        EducationForm ef = new EducationForm();
        ef.setName(name);
        educationFormRepository.save(ef);

        return ResponseEntity.ok(Map.of("id", ef.getId(), "name", ef.getName()));
    }

    @DeleteMapping("/{id}")
    public ResponseEntity<?> delete(@PathVariable Long id) {
        if (!educationFormRepository.existsById(id)) {
            return ResponseEntity.notFound().build();
        }

        // Нельзя удалить форму обучения, пока она используется группами или графиками.
        List<StudentGroup> linked = groupRepository.findByEducationFormId(id);
        if (!linked.isEmpty()) {
            return ResponseEntity.badRequest().body(Map.of(
                    "message", "Невозможно удалить: есть привязанные группы (" + linked.size() + ")"));
        }
        long linkedCalendars = academicCalendarRepository.countByStudyFormId(id);
        if (linkedCalendars > 0) {
            return ResponseEntity.badRequest().body(Map.of(
                    "message", "Невозможно удалить: есть привязанные календарные графики (" + linkedCalendars + ")"));
        }

        educationFormRepository.deleteById(id);
        return ResponseEntity.ok(Map.of("message", "Форма обучения удалена"));
    }
}
