package com.avitam.bankloanapplication.service.impl;

import com.avitam.bankloanapplication.core.service.CoreService;
import com.avitam.bankloanapplication.model.dto.CustomerDto;
import com.avitam.bankloanapplication.model.dto.CustomerWsDto;
import com.avitam.bankloanapplication.model.entity.Customer;
import com.avitam.bankloanapplication.repository.CustomerRepository;
import com.avitam.bankloanapplication.service.CustomerService;
import com.avitam.bankloanapplication.service.ImageConverterService;
import org.apache.commons.lang3.StringUtils;
import org.modelmapper.ModelMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;

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

@Service
public class CustomerServiceImpl implements CustomerService {
    public static final String ADMIN_CUSTOMER = "/admin/customer";
    public static final String URL = "https://api.shreemeenakshifinance.com/images/";
    @Autowired
    private ModelMapper modelMapper;
    @Autowired
    private CoreService coreService;
    @Autowired
    private CustomerRepository customerRepository;
    @Autowired
    private BCryptPasswordEncoder bCryptPasswordEncoder;
    @Autowired
    private ImageConverterService imageConverterService;

    public Customer findByRecordId(String recordId) {
        return customerRepository.findByRecordId(recordId);
    }

    public void deleteByRecordId(String recordId) {
        customerRepository.deleteByRecordId(recordId);
    }

    public CustomerWsDto handleEdit(CustomerDto customerDto) {
        CustomerWsDto customerWsDto = new CustomerWsDto();
        Customer customer = new Customer();
        List<Customer> customerList = new ArrayList<>();
        if (customerDto.getRecordId() != null) {
            customer = customerRepository.findByRecordId(customerDto.getRecordId());
            modelMapper.map(customerDto, customer);
            customerRepository.save(customer);
            customerWsDto.setMessage("Data updated successfully");
        } else {
            customer = modelMapper.map(customerDto, Customer.class);
            customer.setPassword(bCryptPasswordEncoder.encode(customer.getPassword()));
            customer.setCreationTime(new Date());
            customer.setStatus(true);

            List<Customer> customerList1 = customerRepository.findByPanNumber(customer.getPanNumber());
            if (!customerList1.isEmpty()) {
                customerList.add(customer);
                customerWsDto.setMessage("Pan Number already exists");
                customerWsDto.setSuccess(false);
                customerWsDto.setCustomerDtoList(modelMapper.map(customerList, List.class));
                return customerWsDto;
            }
            customerRepository.save(customer);
        }
        if (customerDto.getRecordId() == null) {
            customer.setRecordId(String.valueOf(customer.getId().getTimestamp()));
        }
        if (StringUtils.isNotEmpty(customerDto.getProfileImage())) {
            customer.setProfileImage(URL + imageConverterService.saveImageToPath(customerDto.getProfileImage(), customer.getRecordId()));
        }
        if (StringUtils.isNotEmpty(customerDto.getAadharBackProof())) {
            customer.setAadharBackProof(URL + imageConverterService.saveImageToPath(customerDto.getAadharBackProof(), "aadhar_back" + customer.getRecordId()));
        }
        if (StringUtils.isNotEmpty(customerDto.getPanProof())) {
            customer.setPanProof(URL + imageConverterService.saveImageToPath(customerDto.getPanProof(), "pan_" + customer.getRecordId()));
        }
        if (StringUtils.isNotEmpty(customerDto.getAadharFrontProof())) {
            customer.setAadharFrontProof(URL + imageConverterService.saveImageToPath(customerDto.getAadharFrontProof(), "aadhar_front" + customer.getRecordId()));
        }

        customerRepository.save(customer);
        customerList.add(customer);
        customerDto.setBaseUrl(ADMIN_CUSTOMER);
        customerDto.setMessage("Customer added Successfully");
        customerWsDto.setCustomerDtoList(modelMapper.map(customerList, List.class));
        return customerWsDto;
    }

    public void updateByRecordId(String recordId) {
        Customer customerOptional = customerRepository.findByRecordId(recordId);
        if (customerOptional != null) {
            customerRepository.save(customerOptional);
        }
    }

    @Override
    public Object getCustomerByNationalIdentityNumber(Object o) {
        return null;
    }

    @Override
    public Object getAllCustomers() {
        return null;
    }

    @Override
    public boolean updateResetPasswordToken(String token, String email) {
        return false;
    }

    @Override
    public boolean updateOtp(String token, String email) {
        return false;
    }

    @Override
    public Customer getByResetPasswordToken(String resetPasswordToken) {
        return null;
    }

    @Override
    public void updatePassword(Customer customer, String password) {

    }
}

//            List<Customer> customerList1 = customerRepository.findAll();
//            for(Customer customer1: customerList1){
//                if(customer.getPanNumber().equals(customer1.getPanNumber())){
//                    customerList.add(customer);
//                    customerWsDto.setMessage("Pan Number already exists");
//                    customerWsDto.setSuccess(false);
//                    customerWsDto.setCustomerDtoList(modelMapper.map(customerList, List.class));
//                    return customerWsDto;
//                }
//            }