/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.arrebol.taxiservicios.beans.cobranza;

import com.arrebol.taxiservicios.beans.Datatable;
import com.arrebol.taxiservicios.beans.TaxiGenericBean;
import com.arrebol.taxiservicios.controller.admin.message.MessageController;
import com.arrebol.taxiservicios.controller.cobranza.CobranzaController;
import com.arrebol.taxiservicios.model.catalog.MensajePredefinido;
import com.arrebol.taxiservicios.model.predio.AbonoLote;
import com.arrebol.taxiservicios.model.predio.MensajeEnviado;
import com.arrebol.taxiservicios.model.predio.preCobranzaView;
import com.twilio.Twilio;
import com.twilio.rest.api.v2010.account.Message;
import com.twilio.type.PhoneNumber;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.view.ViewScoped;
import javax.inject.Named;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.primefaces.event.ReorderEvent;
import org.primefaces.event.RowEditEvent;

/**
 *
 * @author pc one
 */
@Named("preCobranzaBean")
@ViewScoped
public class PreCobranzaBean extends TaxiGenericBean implements Serializable, Datatable {

    private static final long serialVersionUID = -2400590341745672164L;
    final Logger logger = LogManager.getLogger(getClass());

    public static final String ACCOUNT_SID = "AC3f21ebff784532f98229abfd8bc0e227";
    public static final String AUTH_TOKEN = "08e8c76db40ea5cc9ed772671909f292";

    private MessageController messageController;
    private List<MensajePredefinido> listMensajePredefinido;
    private List<preCobranzaView> selectedAbonos;
    private String idMensajePredefinido;
    private MensajePredefinido selectedMensajePredefinido;
    private CobranzaController cobranzaController;
    private List<preCobranzaView> abonos;
    private preCobranzaView selectedAbono;
    private Date startDate;
    private Date endDate;
    private Date today;
    private String message;
    private String messageFooter = "Agradecemos su atención y esperamos recibir noticias suyas a la brevedad posible.\n"
            + "Atentamente,\n"
            + "[nombre_usuario]\n"
            + "[nombre_empresa]\n"
            + "[telefono_empresa]\n"
            + "[correo_electronico_empresa]";

    @PostConstruct
    public void init() {
        logger.info("init");
        try {
            LocalDate fechaLocalHoy = LocalDate.now();
            LocalDate fechaLocalMenosUmMes = fechaLocalHoy.minusMonths(1);
            setToday(new Date());
            setStartDate(Date.from(fechaLocalMenosUmMes.atStartOfDay(ZoneId.systemDefault()).toInstant()));
            setEndDate(Date.from(fechaLocalHoy.atStartOfDay(ZoneId.systemDefault()).toInstant()));
            setMessageController(new MessageController());
            setListMensajePredefinido(getMessageController().fillAllMensajePredefinido(getLoggedUser().getLocation()));
            logger.info("loading abonos list");
        } catch (Exception e) {
            logger.error("preCobranzaBean init", e);
        }

    }

    public void updateAbonos() {
        logger.info("updateAbonos()");
        setCobranzaController(new CobranzaController());
        setAbonos(getCobranzaController().fillPreCobranzaViewByFecha(getStartDate(), getEndDate(), getLoggedUser().getLocation()));
    }

    public void loadMensajePredefinido() {
        setMessageController(new MessageController());
        setSelectedMensajePredefinido(getMessageController().fillByIdMensajePredefinido(getIdMensajePredefinido()));
    }

    public void sendMessage() {
        String newMessage = getSelectedMensajePredefinido().getMessage() + getMessage() + ".\n" + getMessageFooter();
        String mensajeActualizado = newMessage
                .replace("[nombre_cliente]", getSelectedAbono().getCompleteName() != null ? getSelectedAbono().getCompleteName() : "")
                .replace("[folio_lote]", getSelectedAbono().getFolio() != null ? getSelectedAbono().getFolio() : "")
                .replace("[fecha]", getSelectedAbono().getFechaAPagar().toString() != null ? getSelectedAbono().getFechaAPagar().toString() : "")
                .replace("[nombre_usuario]", getLoggedUser().getPerson().getFirstName() + " " + getLoggedUser().getPerson().getLastName())
                .replace("[nombre_empresa]", getLoggedUser().getLocation().getBusinessName() != null ? getLoggedUser().getLocation().getBusinessName() : "")
                .replace("[telefono_empresa]", getLoggedUser().getLocation().getPhone() != null ? getLoggedUser().getLocation().getPhone() : "")
                .replace("[correo_electronico_empresa]", getLoggedUser().getLocation().getMail() != null ? getLoggedUser().getLocation().getMail() : "");
        try {
            MensajeEnviado mensajeEnviado = new MensajeEnviado();
            mensajeEnviado.setId(UUID.randomUUID().toString());
            mensajeEnviado.setMensajePredefinido(getSelectedMensajePredefinido());
            mensajeEnviado.setAbonoLote(new AbonoLote(getSelectedAbono().getIdAbonoLote()));
            mensajeEnviado.setMensajeEnviado(mensajeActualizado);
            mensajeEnviado.setActive(1);
            getMessageController().addMensajeEnviado(mensajeEnviado, getLoggedUser(), true);
            logger.info("Add MensajeEnviado");
        } catch (Exception e) {
            logger.error("Error al registrar el mensaje enviado: " + e);
            showMessage(FacesMessage.SEVERITY_FATAL,"Error","Ocurrió un error al registrar el mensaje enviado");
        }
        try {            
             
            
            Twilio.init(ACCOUNT_SID, AUTH_TOKEN);
            PhoneNumber from = new PhoneNumber("whatsapp:+523231125643");
            PhoneNumber to = new PhoneNumber("whatsapp:+18504076816");
            // Envía el mensaje de WhatsApp
            Message mensage = Message.creator(to, from, mensajeActualizado).create();
            
            logger.info("Mensaje enviado: "+mensage.getSid());
            showMessage(FacesMessage.SEVERITY_INFO,"Mensaje enviado","El mensaje se envió correctamente al número "+getSelectedAbono().getContactNumber());
        } catch (Exception e) {
            logger.error("Error al enviar el mensaje: " + e);
            showMessage(FacesMessage.SEVERITY_ERROR,"Error","Ocurrió un error al enviar el mensaje");
        }
    }


    @Override
    public void editRow(RowEditEvent event) {
        throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
    }

    @Override
    public void onRowCancel(RowEditEvent event) {
        throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
    }

    @Override
    public void onRowReorder(ReorderEvent event) {
        showMessage(FacesMessage.SEVERITY_INFO, "Registro Movido", "De columna: " + (event.getFromIndex() + 1) + " a columna: " + (event.getToIndex() + 1));
    }

    @Override
    public void addRow() {
        throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
    }

    @Override
    public void deleteRow() {
        throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
    }

    public CobranzaController getCobranzaController() {
        return cobranzaController;
    }

    public void setCobranzaController(CobranzaController cobranzaController) {
        this.cobranzaController = cobranzaController;
    }

    public List<preCobranzaView> getAbonos() {
        return abonos;
    }

    public void setAbonos(List<preCobranzaView> abonos) {
        this.abonos = abonos;
    }

    public Date getStartDate() {
        return startDate;
    }

    public void setStartDate(Date startDate) {
        this.startDate = startDate;
    }

    public Date getEndDate() {
        return endDate;
    }

    public void setEndDate(Date endDate) {
        this.endDate = endDate;
    }

    @Override
    public Date getToday() {
        return today;
    }

    @Override
    public void setToday(Date today) {
        this.today = today;
    }

    public preCobranzaView getSelectedAbono() {
        return selectedAbono;
    }

    public void setSelectedAbono(preCobranzaView selectedAbono) {
        this.selectedAbono = selectedAbono;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public MessageController getMessageController() {
        return messageController;
    }

    public void setMessageController(MessageController messageController) {
        this.messageController = messageController;
    }

    public List<MensajePredefinido> getListMensajePredefinido() {
        return listMensajePredefinido;
    }

    public void setListMensajePredefinido(List<MensajePredefinido> listMensajePredefinido) {
        this.listMensajePredefinido = listMensajePredefinido;
    }

    public String getIdMensajePredefinido() {
        return idMensajePredefinido;
    }

    public void setIdMensajePredefinido(String idMensajePredefinido) {
        this.idMensajePredefinido = idMensajePredefinido;
    }

    public MensajePredefinido getSelectedMensajePredefinido() {
        return selectedMensajePredefinido;
    }

    public void setSelectedMensajePredefinido(MensajePredefinido selectedMensajePredefinido) {
        this.selectedMensajePredefinido = selectedMensajePredefinido;
    }

    public String getMessageFooter() {
        return messageFooter;
    }

    public void setMessageFooter(String messageFooter) {
        this.messageFooter = messageFooter;
    }

    public List<preCobranzaView> getSelectedAbonos() {
        return selectedAbonos;
    }

    public void setSelectedAbonos(List<preCobranzaView> selectedAbonos) {
        this.selectedAbonos = selectedAbonos;
    }
    
    

}
