package xesj.app.soap;
import jakarta.annotation.PostConstruct;
import jakarta.xml.bind.JAXBElement;
import jakarta.xml.soap.MessageFactory;
import jakarta.xml.soap.SOAPConstants;
import jakarta.xml.soap.SOAPException;
import javax.xml.namespace.QName;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.oxm.jaxb.Jaxb2Marshaller;
import org.springframework.stereotype.Service;
import org.springframework.ws.client.core.support.WebServiceGatewaySupport;
import org.springframework.ws.soap.saaj.SaajSoapMessageFactory;
import legeneralt.FirstRequest;
import legeneralt.FirstResponse;

/**
 * First kliens
 */
@Service
public class FirstClient extends WebServiceGatewaySupport {
  
  @Autowired Jaxb2Marshaller marshaller;
  
  /**
   * Post construct
   */
  @PostConstruct
  public void postConstruct() throws SOAPException {
    
    // Marshaller beállítása
    setMarshaller(marshaller);
    setUnmarshaller(marshaller);
    
    // MessageFactory beállítása
    MessageFactory messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
    SaajSoapMessageFactory saajMessageFactory = new SaajSoapMessageFactory(messageFactory);
    getWebServiceTemplate().setMessageFactory(saajMessageFactory);
    
  }

  /**
   * FirstResponse visszaadása
   */
  public FirstResponse getResponse(int a, int b) throws SOAPException {

    // Request beállítása
    FirstRequest request = new FirstRequest();
    request.setNumberA(new JAXBElement<>(new QName("http://tempuri.org", "Anumber"), Integer.class, a));
    request.setNumberB(new JAXBElement<>(new QName("http://tempuri.org", "Bnumber"), Integer.class, b));
    
    // Soap call
    FirstResponse response = (FirstResponse)getWebServiceTemplate().marshalSendAndReceive(
      "https://soapserver.hu/Services/All.svc",            // Soap URL
      request,                                             // Request objektum
      new MySoapActionCallback("http://tempuri.org/First") // Soap action
      );

    // Válasz
    return response;
    
  }
  
  // ====
}