package com.avitam.bankloanapplication.service.impl;

import com.avitam.bankloanapplication.model.dto.BannerDto;
import com.avitam.bankloanapplication.model.dto.BannerWsDto;
import com.avitam.bankloanapplication.model.dto.LoanTypeDto;
import com.avitam.bankloanapplication.model.entity.Banner;
import com.avitam.bankloanapplication.model.entity.LoanType;
import com.avitam.bankloanapplication.repository.LoanTypeRepository;
import com.avitam.bankloanapplication.repository.generic.BannerRepository;
import com.avitam.bankloanapplication.service.BannerService;
import org.modelmapper.ModelMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

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

@Service
public class BannerServiceImpl implements BannerService {
    public static final String ADMIN_BANNER = "/admin/banner";
    @Autowired
    private BannerRepository bannerRepository;
    @Autowired
    private ModelMapper modelMapper;
    @Autowired
    private LoanTypeRepository loanTypeRepository;


    @Override
    public Banner findByRecordId(String recordId) {

        return bannerRepository.findByRecordId(recordId);
    }

    @Override
    public void deleteByRecordId(String recordId) {

        bannerRepository.deleteByRecordId(recordId);

    }

    @Override
    public BannerWsDto handleEdit(BannerWsDto bannerWsDto) {
        Banner banner = null;
        List<Banner> banners = new ArrayList<>();
        List<BannerDto> bannerDtoList = bannerWsDto.getBannerDtoList();
        for (BannerDto bannerDto1 : bannerDtoList) {
            if (bannerDto1.getRecordId() != null) {
                banner = bannerRepository.findByRecordId(bannerDto1.getRecordId());
                modelMapper.map(bannerDto1, banner);
                banner.setLastModified(new Date());
                bannerRepository.save(banner);
                bannerWsDto.setMessage("Data updated Successfully");
            } else {
                banner = modelMapper.map(bannerDto1, Banner.class);
                banner.setStatus(true);
                banner.setCreationTime(new Date());
                getLoanType(banner);
                modelMapper.map(banner, bannerDto1);
                bannerRepository.save(banner);
            }
            bannerRepository.save(banner);
            if (banner.getRecordId() == null) {
                banner.setRecordId(String.valueOf(banner.getId().getTimestamp()));
            }
            bannerRepository.save(banner);
            bannerWsDto.setMessage("Data added Successfully");
        }
        banners.add(banner);

        bannerWsDto.setBaseUrl(ADMIN_BANNER);
        bannerWsDto.setBannerDtoList(modelMapper.map(banners, List.class));
        return bannerWsDto;
    }

    private void getLoanType(Banner banner) {

        LoanType loanType = loanTypeRepository.findByRecordId(banner.getLoanTypeDto().getRecordId());
        banner.setLoanTypeDto(modelMapper.map(loanType, LoanTypeDto.class));
        bannerRepository.save(banner);

    }

    @Override
    public void updateByRecordId(String recordId) {

        Banner banner = bannerRepository.findByRecordId(recordId);
        if (banner != null) {
            bannerRepository.save(banner);
        }

    }
}
