package com.avitam.bankloanapplication.service.impl;

import com.avitam.bankloanapplication.model.dto.LoanDetailsDto;
import com.avitam.bankloanapplication.model.dto.LoanDetailsWsDto;
import com.avitam.bankloanapplication.model.dto.LoanTemplateDto;
import com.avitam.bankloanapplication.model.dto.LoanTemplateWsDto;
import com.avitam.bankloanapplication.model.entity.LoanDetails;
import com.avitam.bankloanapplication.model.entity.LoanTemplate;
import com.avitam.bankloanapplication.repository.LoanTemplateRepository;
import com.avitam.bankloanapplication.service.ImageConverterService;
import com.avitam.bankloanapplication.service.LoanDetailsService;
import com.avitam.bankloanapplication.service.LoanTemplateService;
import org.apache.commons.lang3.StringUtils;
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 LoanTemplateServiceImpl implements LoanTemplateService {

    public static final String ADMIN_LOAN = "/loans/loantemplate";
    public static final String URL = "https://api.shreemeenakshifinance.com/images/";

    @Autowired
    private LoanTemplateRepository loanTemplateRepository;
    @Autowired
    private ModelMapper modelMapper;
    @Autowired
    private LoanDetailsService loanDetailsService;
    @Autowired
    private ImageConverterService imageConverterService;


    public LoanTemplateWsDto createLoanTemplate(LoanTemplateWsDto request) {
        LoanTemplate loanTemplate = null;
        List<LoanTemplateDto> loanDtos = request.getLoanTemplateDtoList();
        List<LoanTemplate> loanTemplateList = new ArrayList<>();
        for (LoanTemplateDto loanDto : loanDtos) {
            if (loanDto.getRecordId() != null) {
                loanTemplate = loanTemplateRepository.findByRecordId(loanDto.getRecordId());
                modelMapper.map(loanDto, loanTemplate);
                loanTemplateRepository.save(loanTemplate);
                request.setMessage("Data updated successfully");
            } else {
                loanTemplate = modelMapper.map(loanDto, LoanTemplate.class);
                loanTemplate.setStatus(true);
                loanTemplate.setCreationTime(new Date());
                modelMapper.map(loanDto, loanTemplate);
                loanTemplateRepository.save(loanTemplate);
            }
            if (request.getRecordId() == null) {
                loanTemplate.setRecordId(String.valueOf(loanTemplate.getId().getTimestamp()));
            }

            if (StringUtils.isNotEmpty(loanDto.getImages())) {
                loanTemplate.setImages(URL + imageConverterService.saveImageToPath(loanDto.getImages(), loanDto.getLoanName()));
            }

            loanTemplateRepository.save(loanTemplate);

            LoanDetailsWsDto loanDetailsWsDto = new LoanDetailsWsDto();
            List<LoanDetailsDto> loanDetailsDtoList = new ArrayList<>();
            LoanDetails loanDetails = new LoanDetails();
            loanDetails.setLoanId(loanTemplate.getRecordId());
            loanDetailsDtoList.add(modelMapper.map(loanDetails, LoanDetailsDto.class));
            loanDetailsWsDto.setLoanDetailsDtos(loanDetailsDtoList);
            loanTemplateRepository.save(loanTemplate);
            loanDetailsService.createLoanDetailsForLoanTemplate(loanDetailsWsDto);
            loanTemplateList.add(loanTemplate);
            loanDto.setBaseUrl(ADMIN_LOAN);

            request.setMessage("Data added Successfully");
        }

        request.setLoanTemplateDtoList(modelMapper.map(loanTemplateList, List.class));

        return request;
    }
}