package com.bytesw.bytebot.service.provider;

import com.bytesw.bytebot.bean.DeploymentChannelParamValueBean;
import com.bytesw.bytebot.model.enums.AgentParameterEnum;
import com.bytesw.bytebot.model.enums.AgentStatusEnum;
import com.bytesw.bytebot.model.enums.ChannelEnum;
import com.bytesw.bytebot.model.enums.ProviderErrorEnum;
import com.bytesw.bytebot.service.AgentService;
import com.bytesw.xdf.exception.NotFoundException;
import com.twilio.Twilio;
import com.twilio.base.ResourceSet;
import com.twilio.exception.AuthenticationException;
import com.twilio.rest.api.v2010.account.message.Media;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

@Log4j2
@Service
public class TwilioService extends ProviderService {

    @Autowired
    private AgentService agentService;

    public List<DeploymentChannelParamValueBean> getAllParamsWithRefresh() {
        return getAllParams();
    }

    public List<DeploymentChannelParamValueBean> getAllParams() {
        List<DeploymentChannelParamValueBean> agents = new ArrayList<>();
        agents = agentService.GetKeysFromAgents(AgentStatusEnum.DEPLOYED);
        return agents;
    }

    @Override
    protected void completeData(Map<String, Object> info, String SmsId, int agent_id) throws Exception {
        long start_time = System.nanoTime();
        List<DeploymentChannelParamValueBean> agents = getAllParamsWithRefresh();
        long end_time = System.nanoTime();
        long duration = (end_time - start_time) / 1000000;
        log.debug("DURACION: " + duration);
        String sid = "";
        String token = "";
        int MAX_LIMIT = 999;

        List<String> data = new ArrayList<String>();

        log.debug(agents);
        try {
            boolean exist_agent = false;
            for (DeploymentChannelParamValueBean agent : agents) {
                if (agent.getAgen_id() == agent_id && agent.getChannel().equals(ChannelEnum.WHATSAPP.getName())) {
                    if (agent.getChannelParamName().equals(AgentParameterEnum.ACCESS_ID.getName())) {
                        sid = agent.getValue();
                    }
                    if (agent.getChannelParamName().equals(AgentParameterEnum.ACCESS_TOKEN.getName())) {
                        token = agent.getValue();
                    }
                    exist_agent = true;
                }
            }
            if (!exist_agent) {
                log.info("No existe un agente con el ID especificado");
                throw new Exception("No se encontró un agente con canales deployados con dicho ID");
            }
            String[] images_droped = new String[MAX_LIMIT];
            Twilio.init(sid, token);
            ResourceSet<Media> media = Media.reader(SmsId).limit(MAX_LIMIT).read();
            int cont = 0;
            for (Media record : media) {
                Media.deleter(SmsId, record.getSid()).delete();
                images_droped[cont] = record.getSid();
                cont++;
            }
            if (cont == 0) {
                log.info("No hay imágenes para el mensaje indicado");
                throw new NotFoundException("No se encontraron imágenes para el mensaje " + SmsId);
            } else {
                for (String image : Arrays.copyOfRange(images_droped, 0, cont)) {
                    data.add(image);
                }
            }

            info.put("status", "success");

            info.put("data", data);

        } catch (com.twilio.exception.ApiException e) {
            if (e.getMessage().equals(ProviderErrorEnum.AUTHENTICATE.getName())) {
                log.error("Credenciales inválidas para borrar imagen");
                throw new AuthenticationException("Credenciales inválidas");
            } else if (e.getMessage().contains(ProviderErrorEnum.CONEXION.getName())) {
                log.error("Fallo temporal en la conexión con el Proveedor");
                throw new InternalError("Fallo en la conexión con Twilio API");
            } else {
                log.info("El mensaje no existe para : " + SmsId + "\n" + e.getMessage());
                throw new NotFoundException("No se encontraron imágenes para el mensaje " + SmsId);
            }
        } catch (NotFoundException e) {
            throw new NotFoundException(e.getMessage());
        } catch (Exception e) {
            throw new Exception(e.getMessage());
        }
    }
}
