package com.itsol.quantrivanphong.manager.project.project.bussiness;

import com.itsol.quantrivanphong.manager.project.project.dto.ProjectDTO;
import com.itsol.quantrivanphong.manager.project.project.repository.ProjectRepository;
import com.itsol.quantrivanphong.model.Project;
import com.itsol.quantrivanphong.report.issue.common.AbstractDaoPage;
import com.itsol.quantrivanphong.report.issue.common.WrapperResult;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class ProjectBussinessImpl implements ProjectBussiness {
    private Logger logger = Logger.getLogger(ProjectBussinessImpl.class);
    @Autowired
    private ProjectRepository projectRepository;

    @Override
    public List<ProjectDTO> findAllProject() {
        try {
            return lstDTO(projectRepository.findAll());
        } catch (Exception e) {
            logger.info("Lỗi findAll " + e.getMessage());
        }
        return null;
    }

    @Override
    public WrapperResult updateProject(ProjectDTO dto) {
        String views = null;
        int status = 113;
        try {
            ProjectDTO projectDTO = findByProjectId(dto.getId());
            dto.setStartDate(projectDTO.getStartDate());
            dto.setEndDate(projectDTO.getEndDate());
            if (dto.getStartDate() == null) {
                views = "ngày bắt đầu dự án không được null";
            } else if (dto.getEndDate() == null) {
                views = "ngày dự kiếm kết thúc dự án không được null";
            } else if (projectDTO != null) {
                ProjectDTO updateProject = modelparseDto(projectRepository.save(dtoParseModels(dto)));
                if (updateProject != null) {
                    views = "sửa thành công project";
                    status = 200;
                }
            } else {
                views = "không tìm thấy project phù hợp";
            }
        } catch (Exception e) {
            logger.info("Lỗi update" + e.getMessage());
            views = "lỗi update project";
        }
        return new WrapperResult(status, views);
    }

    @Override
    public WrapperResult saveProject(ProjectDTO dto) {
        String views = null;
        int status = 113;
        if (projectRepository.findByName(dto.getName()) == null) {
            try {
                if (dto.getStartDate() == null) {
                    views = "ngày bắt đầu dự án không được null";
                } else if (dto.getEndDate() == null) {
                    views = "ngày dự kiếm kết thúc dự án không được null";
                } else {
                    dto.setStatus(0);
//                projectRepository.saveEntity(dtoParseModels(dto));
                    ProjectDTO saveProject = modelparseDto(projectRepository.save(dtoParseModels(dto)));
                    if (saveProject != null) {
                        views = "thêm thành công project !";
                        status = 200;
                    } else {
                        views = "thêm project không thành công!";
                    }
                }
            } catch (Exception e) {
                logger.info("Lỗi insert " + e.getMessage());
                views = "Lỗi thêm dữ liệu";
            }
        } else {
            views = "Đã tồn tại Dự Án";
        }
        return new WrapperResult(status, views);
    }

    @Override
    public ProjectDTO findByProjectId(Integer id) {
        try {
            ProjectDTO projectDTO = modelparseDto(projectRepository.findProjectById(id));
            if (projectDTO != null) {
                return projectDTO;
            }
        } catch (Exception e) {
            logger.info("( Lỗi tìm kiếm ) " + e.getMessage());
        }
        return null;
    }

    @Override
    public WrapperResult deleteProjectById(Integer id) {
        String views = null;
        int status = 113;
        logger.info("deleteProjectById");
        if (findByProjectId(id) != null) {
            try {
                projectRepository.deleteById(id);
                views = "xóa thành công project";
                status = 200;
            } catch (Exception e) {
                logger.info("lỗi :" + e.getMessage());
                views = "Lỗi xóa";
            }
        } else {
            views = "dự án không tồn tại không tồn tại";
        }
        return new WrapperResult(status, views);
    }

    @Override
    public AbstractDaoPage<ProjectDTO> getPageProject(int page, int pageSize) {
        AbstractDaoPage<ProjectDTO> abstractDaoPage = new AbstractDaoPage<ProjectDTO>();
        List<Project> lstM = getListPage(page,pageSize);
        List<ProjectDTO> listDTO = lstDTO(lstM);
        abstractDaoPage.setLstResult(listDTO);
        abstractDaoPage.setPage(page);
        abstractDaoPage.setMaxPageItem(pageSize);
        abstractDaoPage.setTotalItem(findAllProject().size());
        abstractDaoPage.setTotalPage((int)Math.ceil((double) abstractDaoPage.getTotalItem()/abstractDaoPage.getMaxPageItem()));
        return abstractDaoPage;
    }

    public List<Project> getListPage(int page, int pageSize) {
        Pageable paging = PageRequest.of(page,pageSize);
        Page<Project> pagedResult = projectRepository.findAll(paging);

        if(pagedResult.hasContent()) {
            return pagedResult.getContent();
        } else {
            return new ArrayList<Project>();
        }
    }

    public List<ProjectDTO> lstDTO(List<Project> lstModels) {
        List<ProjectDTO> lstDTO = new ArrayList<>();
        for (Project project : lstModels) {
            lstDTO.add(modelparseDto(project));
        }
        return lstDTO;
    }

    public ProjectDTO modelparseDto(Project model) {
        ProjectDTO dto = new ProjectDTO();
        dto.setId(model.getId());
        dto.setName(model.getName());
        dto.setDescriptions(model.getDescriptions());
        dto.setStartDate(model.getStartDate());
        dto.setEndDate(model.getEndDate());
        dto.setStatus(model.getStatus());

        return dto;
    }

    public Project dtoParseModels(ProjectDTO projectDTO) {
        Project project = new Project();
        project.setId(projectDTO.getId());
        project.setName(projectDTO.getName());
        project.setDescriptions(projectDTO.getDescriptions());
        project.setStartDate(projectDTO.getStartDate());
        project.setEndDate(projectDTO.getEndDate());
        project.setStatus(projectDTO.getStatus());
        return project;
    }
}
