package com.syzton.sunread.service.fish;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.syzton.sunread.dto.fish.StudentFishDTO;
import com.syzton.sunread.exception.common.NotFoundException;
import com.syzton.sunread.model.fish.Fish;
import com.syzton.sunread.model.fish.StudentFish;
import com.syzton.sunread.model.organization.Clazz;
import com.syzton.sunread.model.user.Student;
import com.syzton.sunread.repository.fish.FishRepository;
import com.syzton.sunread.repository.fish.StudentFishRepository;
import com.syzton.sunread.repository.organization.ClazzRepository;
import com.syzton.sunread.repository.user.StudentRepository;
/**
* Created by jerry on 4/21/15.
*/
@Service
public class FishRepositoryService implements FishService{
private FishRepository fishRepository;
private StudentRepository studentRepository;
private StudentFishRepository studentFishRepository;
private ClazzRepository clazzRepository;
@Autowired
public FishRepositoryService(FishRepository fishRepository, StudentRepository studentRepository, StudentFishRepository studentFishRepository, ClazzRepository clazzRepository) {
this.fishRepository = fishRepository;
this.studentRepository = studentRepository;
this.studentFishRepository = studentFishRepository;
this.clazzRepository = clazzRepository;
}
@Override
public void addFish(Fish fish) {
fishRepository.save(fish);
}
@Override
public void deleteFish(Long fishId) {
getFish(fishId);
fishRepository.delete(fishId);
}
private Fish getFish(Long fishId) {
Fish exits = fishRepository.findOne(fishId);
if (exits == null){
throw new NotFoundException("Fish with id ="+ fishId +" not found...");
}
return exits;
}
@Transactional
@Override
public void updateFishPic(Long fishId, String fishPic) {
Fish fish = getFish(fishId);
fish.setFishPic(fishPic);
fishRepository.save(fish);
}
@Override
public Fish findFish(long fishId) {
return this.getFish(fishId);
}
@Override
public List<Fish> findAllFish() {
return fishRepository.findAll();
}
// @Transactional
// @Override
// public List<StudentFishDTO> getFishStudentDTOsByStudentId(long studentId) {
//
//
// Student student = getStudent(studentId);
// Clazz clazz = clazzRepository.findOne(student.getClazzId());
//
// if (clazz == null)
// throw new NotFoundException("clazz with id ="+student.getClazzId()+" not found...");
// StudentFish studentFish = studentFishRepository.findByStudentId(studentId);
// List<StudentFishDTO> studentFishDTOs = new ArrayList<>();
// StudentFishDTO currentStudentFishDTO = createStudentFishDTO(clazz, student,studentFish.getFish());
//
//
// List<Student> inClazzStudents = studentRepository.findByClazzId(student.getClazzId());
// for (Student inClazzStudent : inClazzStudents)
// {
// StudentFish sFish = studentFishRepository.findByStudentId(inClazzStudent.getId());
// if(student.getId() == inClazzStudent.getId() || sFish == null)
// continue;
//
// StudentFishDTO inClazzSFDTO = createStudentFishDTO(clazz, inClazzStudent,sFish.getFish());
//
// studentFishDTOs.add(inClazzSFDTO);
//
// }
// int subCount = 20;
// if(studentFishDTOs.size() > subCount){
// studentFishDTOs = randomSubset(studentFishDTOs,subCount - 1);
// }
//
// studentFishDTOs.add(currentStudentFishDTO);
//
// return studentFishDTOs;
// }
@Transactional
@Override
public List<StudentFishDTO> getFishStudentDTOsByClazzId(long clazzId) {
Clazz clazz = clazzRepository.findOne(clazzId);
if (clazz == null)
throw new NotFoundException("clazz with id ="+clazzId+" not found...");
List<StudentFishDTO> studentFishDTOs = new ArrayList<>();
List<Student> inClazzStudents = studentRepository.findByClazzId(clazzId);
for (Student inClazzStudent : inClazzStudents)
{
StudentFish sFish = studentFishRepository.findByStudentId(inClazzStudent.getId());
if(sFish == null)
continue;
StudentFishDTO inClazzSFDTO = createStudentFishDTO(clazz, inClazzStudent,sFish.getFish());
studentFishDTOs.add(inClazzSFDTO);
}
int subCount = 20;
if(studentFishDTOs.size() > subCount){
studentFishDTOs = randomSubset(studentFishDTOs,subCount - 1);
}
return studentFishDTOs;
}
private Student getStudent(long studentId) {
Student student = studentRepository.findOne(studentId);
if (student == null)
throw new NotFoundException("student with id ="+studentId+" not found...");
return student;
}
@Transactional
@Override
public void saveOrUpdateStudentFish(long studentId, long fishId) {
Fish fish = this.getFish(fishId);
Student student = getStudent(studentId);
StudentFish studentFish = studentFishRepository.findByStudentId(studentId);
if (studentFish == null)
studentFish = new StudentFish();
studentFish.setStudentId(student.getId());
studentFish.setFish(fish);
studentFishRepository.save(studentFish);
}
@Override
public Fish findFishByStudentId(long studentId) {
Fish currentStuFish = studentFishRepository.findByStudentId(studentId).getFish();
return currentStuFish;
}
private StudentFishDTO createStudentFishDTO(Clazz clazz, Student inClazzStudent,Fish fish) {
StudentFishDTO studentFishDTO = new StudentFishDTO();
studentFishDTO.setStudentId(inClazzStudent.getId());
studentFishDTO.setStudentName(inClazzStudent.getUsername());
studentFishDTO.setStudentIdentity(inClazzStudent.getIdentity());
studentFishDTO.setRole("ROLE_STUDENT");
studentFishDTO.setClazzName(clazz.getName());
studentFishDTO.setClazzId(clazz.getId());
studentFishDTO.setCampusId(clazz.getCampus().getId());
studentFishDTO.setCampusName(clazz.getCampus().getName());
studentFishDTO.setCoin(inClazzStudent.getStatistic().getCoin());
studentFishDTO.setReadNum(inClazzStudent.getStatistic().getReadNum());
studentFishDTO.setFishId(fish.getId());
return studentFishDTO;
}
public static List randomSubset(final List list, final int subCount) {
if (list == null || list.size() == 0 || list.size() < subCount) {
throw new RuntimeException("获取随机子集的参数不合逻辑!");
}
List rs = new ArrayList(subCount);
for (int i = 0; i < subCount; i++) {
rs.add(null);
}
Random random = new Random();
for (int i = 0, odd = list.size() - 1; i < subCount; i++, odd--) {
int ranindex = random.nextInt(odd);
rs.set(i, list.get(ranindex));
list.set(ranindex, list.get(odd));
}
return rs;
}
}