/**
 * 
 */
package com.zyrion.traverse.services.impl.bve.test;

import com.zyrion.traverse.services.api.device.DeviceService;
import com.zyrion.traverse.services.api.sessionManager.SessionManagerService;
import com.zyrion.traverse.services.types.device.DeviceInfoResponse;
import com.zyrion.traverse.services.types.device.ListDevicesRequest;
import com.zyrion.traverse.services.types.global.DeviceInfo;
import com.zyrion.traverse.services.types.global.ObjectFilter;
import com.zyrion.traverse.services.types.sessionManager.LoginRequest;
import com.zyrion.traverse.services.types.sessionManager.LoginResponse;
import com.zyrion.traverse.services.types.sessionManager.LogoutRequest;
import com.zyrion.traverse.services.types.sessionManager.SessionRequest.LoginType;
import com.zyrion.traverse.services.types.sessionManager.SessionRequest.SessionType;
import com.zyrion.traverse.utils.LocalIPAddress;

import org.apache.commons.httpclient.protocol.DefaultProtocolSocketFactory;
import org.apache.commons.httpclient.protocol.Protocol;
import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;

import java.net.URL;

/**
 * @author fguimond
 *
 */
public class DeviceUtilsTest {


  private static final String PROTOCOL = "http";
  private static final String HOST = "localhost";
  private static final int PORT = 80;
  private static final String USERNAME = "traverse";
  private static final String PASSWORD = "traverse";

  public static void main(String args[]) {
  JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();

    //ProtocolSocketFactory easy = new RelaxedXfireSocketFactory(); // https
    ProtocolSocketFactory easy = new DefaultProtocolSocketFactory();  // http
    Protocol clientProtocol = new Protocol( PROTOCOL, easy, PORT );
    Protocol.registerProtocol( PROTOCOL, clientProtocol );
    SessionManagerService loginService = null;
    String sessionId = null;

    try {
      // Create the login request
      URL loginUrl = new URL( PROTOCOL, HOST, PORT, "/api/soap/public/sessionManager" );
      factory.setServiceClass( com.zyrion.traverse.services.api.sessionManager.SessionManagerService.class );
      factory.setAddress( loginUrl.toString() );
      loginService = ( SessionManagerService  )factory.create();

      // Build login request
      LoginRequest request = new LoginRequest();
      request.setUsername( USERNAME );
      request.setPassword( PASSWORD );
      request.setLoginType( LoginType.USERNAME );
      request.setSessionType( SessionType.TRAVERSE );
      String remoteAddress = "Dashboard Test Client";
      remoteAddress = LocalIPAddress.getAddress();
      request.setRemoteAddress( remoteAddress );

      // Send request and process response
      LoginResponse response = loginService.login( request );
      if( response.getStatusCode() != 0 ) {
        System.out.println( "Error login in: " + response.getStatusMessage() );
        System.exit( -1 );
      }

      sessionId = response.getSessionID();

      URL dbUrl = new URL( PROTOCOL, HOST, PORT, "/api/soap/public/device" );
      factory.setServiceClass(com.zyrion.traverse.services.api.device.DeviceService.class);
      factory.setAddress(dbUrl.toString());
      DeviceService deviceService = ( DeviceService ) factory.create();

      ObjectFilter criteria = new ObjectFilter();
      criteria.setDeviceName( "ip*" );

      ListDevicesRequest searchDevicesReq = new ListDevicesRequest();
      searchDevicesReq.setSessionId( sessionId );
      searchDevicesReq.setDeviceFilter( criteria );
      
      DeviceInfoResponse searchDevicesResp = deviceService.listDevices( searchDevicesReq );
      if( searchDevicesResp.getStatusCode() == 0 ) {
        System.out.println( searchDevicesResp.getStatusMessage() );
        for( DeviceInfo info : searchDevicesResp.getObjectInfo() ) {
          System.out.println( "Device: " + info.getName() + "-" + info.getAddress() + " (" + info.getSerialNumber() + ")");
        }
      } else {
        System.err.println( "Error searching for devices: " + searchDevicesResp.getStatusMessage() );
      }

      // Logout
      LogoutRequest logoutReq = new LogoutRequest();
      logoutReq.setLoginSessionID( sessionId );
      loginService.logout( logoutReq );
    } catch( Exception e ) {
      e.printStackTrace();
    }
  }
}
