package ovh.herisson.Clyde.Services;

import org.springframework.stereotype.Service;
import ovh.herisson.Clyde.Repositories.CourseRepository;
import ovh.herisson.Clyde.Repositories.CurriculumCourseRepository;
import ovh.herisson.Clyde.Repositories.CurriculumRepository;
import ovh.herisson.Clyde.Tables.*;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

@Service
public class CurriculumCourseService {

    private final CurriculumCourseRepository curriculumCourseRepo;

    private final CourseRepository courseRepo;

    private final CurriculumRepository curriculumRepo;

    public CurriculumCourseService(CurriculumCourseRepository curriculumCourseRepository, CourseRepository courseRepo, CurriculumRepository curriculumRepo) {
        this.curriculumCourseRepo = curriculumCourseRepository;
        this.courseRepo = courseRepo;
        this.curriculumRepo = curriculumRepo;
    }

    public void save(CurriculumCourse curriculumCourse){
        curriculumCourseRepo.save(curriculumCourse);
    }


    public Map<String, Object> getDepthCurriculum(Curriculum curriculum){

        if (curriculum == null)
            return null;

        HashMap<String ,Object> toReturn = new HashMap<>();
        ArrayList<Map<String ,Object>> courses = new ArrayList<>();
        Iterable<Course> foundCourses = curriculumCourseRepo.findCoursesByCurriculum(curriculum);

        for (Course c: foundCourses){
            courses.add(ProtectionService.courseWithoutPassword(c));
        }
        toReturn.put("courses",courses);
        toReturn.put("curriculumId", curriculum.getCurriculumId());
        toReturn.put("year", curriculum.getYear());
        toReturn.put("option", curriculum.getOption());


        return  toReturn;
    }

    public Iterable<Map<String, Object>> getAllDepthCurriculum(){

        ArrayList<Map<String,Object>> toReturn = new ArrayList<>();

        for (Curriculum curriculum : curriculumRepo.findAll()){
            toReturn.add(getDepthCurriculum(curriculum));
        }


        return toReturn;
    }

    /** tries to add all courses to the curriculum
     *
     * @param coursesIds the ids of the courses to be added
     * @param curriculum the curriculum to add the courses to
     * @return if the changes were made
     */
    public boolean saveAll(Iterable<Long> coursesIds, Curriculum curriculum) {

        if (curriculum == null || coursesIds == null)
            return false;

        ArrayList<Course> toAdd = new ArrayList<>();
        for (Long courseId : coursesIds){

            Course course = courseRepo.findById((long) courseId);
            if (course == null)
                return false;

            if (!toAdd.contains(course))
                toAdd.add(course);
        }

        for (Course course : toAdd){
            curriculumCourseRepo.save(new CurriculumCourse(curriculum,course));
        }
        return true;
    }
}
