package com.syzton.sunread.service.semester;
import java.util.ArrayList;
import org.joda.time.DateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.syzton.sunread.assembler.semester.SemesterAssembler;
import com.syzton.sunread.dto.semester.SemesterDTO;
import com.syzton.sunread.exception.common.DuplicateException;
import com.syzton.sunread.exception.common.NotFoundException;
import com.syzton.sunread.model.organization.Campus;
import com.syzton.sunread.model.organization.Clazz;
import com.syzton.sunread.model.semester.Semester;
import com.syzton.sunread.model.user.Student;
import com.syzton.sunread.repository.SemesterRepository;
import com.syzton.sunread.repository.organization.CampusRepository;
import com.syzton.sunread.repository.organization.ClazzRepository;
import com.syzton.sunread.repository.user.StudentRepository;
/*
* @Date 2015-3-22
* @Author Morgan-Leon
*/
@Service
public class SemesterRepositoryService implements SemesterService{
private static final Logger LOGGER = LoggerFactory.getLogger(SemesterRepositoryService.class);
private SemesterRepository semesterRepo;
private CampusRepository campusRepository;
private StudentRepository studentRepository;
private ClazzRepository clazzRepository;
@Autowired
public SemesterRepositoryService(SemesterRepository repository,CampusRepository campusRepository) {
// TODO Auto-generated constructor stub
this.semesterRepo = repository;
this.campusRepository = campusRepository;
}
@Autowired
public void StudentRepositoryService(StudentRepository studentRepository) {
this.studentRepository = studentRepository;
}
@Autowired
public void ClazzRepositoryService(ClazzRepository clazzRepository) {
this.clazzRepository = clazzRepository;
}
@Transactional(rollbackFor = {DuplicateException.class})
@Override
public SemesterDTO add(SemesterDTO added,Long campusId) {
LOGGER.debug("Adding a new Semester with information: {}", added);
Campus campus = campusRepository.findOne(campusId);
if(campus == null)
throw new NotFoundException("no campus found with id:"+ campusId);
SemesterAssembler assembler = new SemesterAssembler();
Semester model = assembler.fromDTOtoModel(added,campus);
semesterRepo.save(model);
added = model.createDTO();
return added;
}
@Transactional(rollbackFor = {NotFoundException.class})
@Override
public Semester deleteById(long id) {
LOGGER.debug("Deleting a Semester with id: {}", id);
Semester deleted = findOne(id);
if(deleted == null)
throw new NotFoundException("No Semester found with id: " + id);
LOGGER.debug("Deleting semester entry: {}", deleted);
semesterRepo.delete(deleted);
return deleted;
}
@Transactional(rollbackFor = {NotFoundException.class})
@Override
public SemesterDTO update(SemesterDTO updated,Long id) {
LOGGER.debug("Updating contact with information: {}", updated);
Semester model = findOne(id);
if(model == null)
throw new NotFoundException("No Semester found with id: " + id);
Campus campus = campusRepository.findOne(updated.getCampusId());
if(campus == null)
throw new NotFoundException("no campus found with id:"+ updated.getCampusId());
DateTime temp = model.getCreationTime();
SemesterAssembler assembler = new SemesterAssembler();
model = assembler.fromDTOtoModel(updated,campus);
model.setId(id);
model.setCreationTime(temp);
semesterRepo.save(model);
return model.createDTO();
}
@Override
public Semester findOne(Long id) {
LOGGER.debug("Finding a Semester with id: {}", id);
Semester found = semesterRepo.findOne(id);
LOGGER.debug("Found semester entry: {}", found);
if (found == null) {
throw new NotFoundException("No Semester found with id: " + id);
}
return found;
}
@Override
public Semester findByTime(DateTime time,long campusId) {
LOGGER.debug("Finding a Semester with id: {}", time);
Campus campus = campusRepository.findOne(campusId);
if(campus == null)
throw new NotFoundException("no campus found with id:"+ campusId);
Semester found = semesterRepo.findByTimeAndCampus(time, campus);
LOGGER.debug("Found semester entry: {}", found);
if (found == null) {
throw new NotFoundException("No Semester found with id: " + time);
}
return found;
}
@Override
public Page<Semester> findAll(Pageable pageable) {
LOGGER.debug("Finding all semester entries");
Page<Semester> semesters = semesterRepo.findAll(pageable);
if (semesters == null) {
throw new NotFoundException("No Semester found");
}
return semesters;
}
@Override
public Page<Semester> findByCampus(long campusId,Pageable pageable) {
LOGGER.debug("Finding all semester entries");
Campus campus = campusRepository.findOne(campusId);
if(campus == null)
throw new NotFoundException("no campus found with id:"+ campusId);
Page<Semester> semesters = semesterRepo.findByCampus(campus, pageable);
if (semesters == null) {
throw new NotFoundException("No Semester found");
}
return semesters;
}
@Override
public ArrayList<Semester> findByStudentId(Long studentId){
LOGGER.debug("Finding all semester entries");
Student student = studentRepository.findOne(studentId);
if(student == null){
throw new NotFoundException("Student with ID :"+studentId);
}
Clazz clazz = clazzRepository.findOne(student.getClazzId());
int grade = clazz.getGrade();
DateTime currentTime = DateTime.now();
DateTime fromTime = currentTime.minusYears(grade);
// Campus campus = campusRepository.findOne(clazz.getCampus().getId()
ArrayList<Semester> semesters = (ArrayList<Semester>) semesterRepo.findByDuration(fromTime,currentTime,clazz.getCampus());
if (semesters == null) {
throw new NotFoundException("No Semester found");
}
return semesters;
}
}