package com.hpay.hpay_mobile_api.services;

import com.hpay.hpay_mobile_api.DTO.ClientCreateDTO;
import com.hpay.hpay_mobile_api.DTO.ErrorResponse;
import com.hpay.hpay_mobile_api.DTO.SuccessResponse;
import com.hpay.hpay_mobile_api.entities.Client;
import com.hpay.hpay_mobile_api.entities.LoginClient;
import com.hpay.hpay_mobile_api.repositories.ClientRepository;
import com.hpay.hpay_mobile_api.utils.SendEmail;
import jakarta.mail.MessagingException;
import jakarta.transaction.Transactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Optional;
import java.util.Random;

@Service
public class ClientService {

    @Autowired
    private ClientRepository clientRepository;

    public List<Client> getAllClients() {
        return clientRepository.findAll();
    }

    public Optional<Client> getClientById(Long id) {
        return clientRepository.findById(id);
    }

    public Client createClient(ClientCreateDTO clientCreateDTO) {
        // Create new Client object using DTO
        Client client = new Client();
        client.setClientCode(clientCreateDTO.getClientCode());
        client.setNumPiece(clientCreateDTO.getNumPiece());
        client.setDateInscrit(clientCreateDTO.getDateInscrit());
        //client.setIdVille(clientCreateDTO.getIdVille());
        client.setIdTypePiece(clientCreateDTO.getIdTypePiece());
       // client.setIdPays(clientCreateDTO.getIdPays());
        client.setIdAgence(clientCreateDTO.getIdAgence());
        client.setIdGestionnaire(clientCreateDTO.getIdGestionnaire());
        client.setIdCommercial(clientCreateDTO.getIdCommercial());
        client.setGainCommercial(clientCreateDTO.getGainCommercial());
        client.setValider(clientCreateDTO.getValider());
        client.setGainPaye(clientCreateDTO.getGainPaye());

        // Save the client to the database
        return clientRepository.save(client);
    }

    public Client updateClient(Long id, Client clientDetails) {
        Client client = clientRepository.findById(id).orElseThrow(() -> new RuntimeException("Client not found"));
        client.setClientCode(clientDetails.getClientCode());
        client.setNom(clientDetails.getNom());
        // Update other fields as necessary
        return clientRepository.save(client);
    }

    public void deleteClient(Long id) {
        clientRepository.deleteById(id);
    }

    public List<Long> getClientIdsByPhoneNumbers(List<Integer> phoneNumbers) {
        return clientRepository.findClientIdsByPhoneNumbers(phoneNumbers);
    }

    public Client getClientByEmail(String email) {
        return clientRepository.findByEmail(email).orElse(null);
    }



    public Object updateFCMToken(Long idClient, String token) {

        // Find the LoginClient by its ID
        Client  client = clientRepository.findById(idClient).orElse(null);

        if (client == null) {
            return new ErrorResponse("Client not found", 404);
        }

        client.setFcmToken(token);
        clientRepository.save(client);


        HashMap<String, Object> map = new HashMap<>();
        map.put("data",client);
        return new SuccessResponse("update succesfull", 200, map );
    }


}