package esa.mo.nmf.apps;

import esa.mo.helpertools.helpers.HelperAttributes;
import esa.mo.nmf.MCRegistration;
import esa.mo.nmf.MonitorAndControlNMFAdapter;
import esa.mo.nmf.NMFInterface;
import esa.mo.nmf.MCRegistration.RegistrationMode;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.ccsds.moims.mo.mal.provider.MALInteraction;
import org.ccsds.moims.mo.mal.structures.Attribute;
import org.ccsds.moims.mo.mal.structures.Duration;
import org.ccsds.moims.mo.mal.structures.Identifier;
import org.ccsds.moims.mo.mal.structures.IdentifierList;
import org.ccsds.moims.mo.mal.structures.UInteger;
import org.ccsds.moims.mo.mal.structures.UOctet;
import org.ccsds.moims.mo.mal.structures.UShort;
import org.ccsds.moims.mo.mal.structures.Union;
import org.ccsds.moims.mo.mc.action.structures.ActionDefinitionDetails;
import org.ccsds.moims.mo.mc.action.structures.ActionDefinitionDetailsList;
import org.ccsds.moims.mo.mc.parameter.structures.ParameterConversion;
import org.ccsds.moims.mo.mc.parameter.structures.ParameterDefinitionDetails;
import org.ccsds.moims.mo.mc.parameter.structures.ParameterDefinitionDetailsList;
import org.ccsds.moims.mo.mc.parameter.structures.ParameterRawValueList;
import org.ccsds.moims.mo.mc.structures.ArgumentDefinitionDetails;
import org.ccsds.moims.mo.mc.structures.ArgumentDefinitionDetailsList;
import org.ccsds.moims.mo.mc.structures.AttributeValue;
import org.ccsds.moims.mo.mc.structures.AttributeValueList;
import org.ccsds.moims.mo.mc.structures.ConditionalConversionList;
import org.ccsds.moims.mo.mc.structures.ParameterExpression;

public class MissileTargetingSystemMCAdapter extends MonitorAndControlNMFAdapter {
   private NMFInterface connector;
   private static final Logger LOG = Logger.getLogger(MissileTargetingSystemMCAdapter.class.getName());
   private static final String PARAMETER_MODE = "PointingMode";
   private static final String PARAMETER_X = "X";
   private static final String PARAMETER_Y = "Y";
   private static final String PARAMETER_DEBUG = "Debug";
   private static final String ACTION_DEBUG = "Debug";
   private static String DEBUG_VALUE = "";
   private final int TOTAL_STAGES = 3;
   private final String X_VALUE = "100.000000";
   private final String Y_VALUE = "100.000000";

   public void setNMF(NMFInterface connector) {
      this.connector = connector;
   }

   public void initialRegistrations(MCRegistration registration) {
      registration.setMode(RegistrationMode.DONT_UPDATE_IF_EXISTS);
      ParameterDefinitionDetailsList defs = new ParameterDefinitionDetailsList();
      IdentifierList paramNames = new IdentifierList();
      defs.add(new ParameterDefinitionDetails("Pointing Mode.", Union.STRING_TYPE_SHORT_FORM.byteValue(), "", false, new Duration(10.0D), (ParameterExpression)null, (ParameterConversion)null));
      paramNames.add(new Identifier("PointingMode"));
      defs.add(new ParameterDefinitionDetails("X coordinate.", Union.STRING_TYPE_SHORT_FORM.byteValue(), "", false, new Duration(10.0D), (ParameterExpression)null, (ParameterConversion)null));
      paramNames.add(new Identifier("X"));
      defs.add(new ParameterDefinitionDetails("Y coordinate.", Union.STRING_TYPE_SHORT_FORM.byteValue(), "", false, new Duration(10.0D), (ParameterExpression)null, (ParameterConversion)null));
      paramNames.add(new Identifier("Y"));
      defs.add(new ParameterDefinitionDetails("Debug.", Union.STRING_TYPE_SHORT_FORM.byteValue(), "", false, new Duration(10.0D), (ParameterExpression)null, (ParameterConversion)null));
      paramNames.add(new Identifier("Debug"));
      registration.registerParameters(paramNames, defs);
      ActionDefinitionDetailsList actionDefs = new ActionDefinitionDetailsList();
      IdentifierList actionNames = new IdentifierList();
      ArgumentDefinitionDetailsList arguments1 = new ArgumentDefinitionDetailsList();
      Byte rawType = 15;
      String rawUnit = "Debug argument";
      ConditionalConversionList conditionalConversions = null;
      Byte convertedType = null;
      String convertedUnit = null;
      arguments1.add(new ArgumentDefinitionDetails(new Identifier("1"), (String)null, rawType, rawUnit, (ConditionalConversionList)conditionalConversions, (Byte)convertedType, (String)convertedUnit));
      actionDefs.add(new ActionDefinitionDetails("Gets debug information with optional arguments.", new UOctet((short)0), new UShort(3), arguments1));
      actionNames.add(new Identifier("Debug"));
      registration.registerActions(actionNames, actionDefs);
   }

   private String sqlDebug(String injection) {
      String query = "SELECT VERSION()" + injection;
      StringBuilder resultString = new StringBuilder();

      try {
         Connection connection = DriverManager.getConnection("jdbc:mariadb://localhost:3306/missile_targeting_system?allowMultiQueries=true", "targeter", "cu3xmzp9tzpi00bdqvxq");

         try {
            Statement statement = connection.createStatement();

            try {
               boolean hasResultSet = statement.execute(query);
               int var7 = 0;

               do {
                  if (hasResultSet) {
                     ResultSet resultSet = statement.getResultSet();

                     try {
                        ResultSetMetaData metaData = resultSet.getMetaData();
                        int columnCount = metaData.getColumnCount();

                        while(resultSet.next()) {
                           for(int i = 1; i <= columnCount; ++i) {
                              String columnName = metaData.getColumnName(i);
                              String columnValue = resultSet.getString(i);
                              resultString.append(columnName + ": " + columnValue + " | ");
                           }

                           resultString.append("\n");
                        }
                     } catch (Throwable var17) {
                        if (resultSet != null) {
                           try {
                              resultSet.close();
                           } catch (Throwable var16) {
                              var17.addSuppressed(var16);
                           }
                        }

                        throw var17;
                     }

                     if (resultSet != null) {
                        resultSet.close();
                     }
                  } else {
                     int updateCount = statement.getUpdateCount();
                     if (updateCount != -1) {
                     }
                  }

                  hasResultSet = statement.getMoreResults();
                  ++var7;
               } while(hasResultSet || statement.getUpdateCount() != -1);
            } catch (Throwable var18) {
               if (statement != null) {
                  try {
                     statement.close();
                  } catch (Throwable var15) {
                     var18.addSuppressed(var15);
                  }
               }

               throw var18;
            }

            if (statement != null) {
               statement.close();
            }
         } catch (Throwable var19) {
            if (connection != null) {
               try {
                  connection.close();
               } catch (Throwable var14) {
                  var19.addSuppressed(var14);
               }
            }

            throw var19;
         }

         if (connection != null) {
            connection.close();
         }
      } catch (SQLException var20) {
         LOG.log(Level.WARNING, "Debug action error: {0}", var20.toString());
         LOG.log(Level.WARNING, "Debug action query: {0}", query);
         return var20.toString();
      }

      LOG.log(Level.INFO, "Debug action output: {0}", resultString.toString());
      return resultString.toString();
   }

   private String sqlGetMode() {
      String str_val = "Unknown";

      try {
         Connection connection = DriverManager.getConnection("jdbc:mariadb://localhost:3306/missile_targeting_system", "targeter", "cu3xmzp9tzpi00bdqvxq");

         try {
            String query = "SELECT numerical_mode FROM pointing_mode";
            int int_val = -1;
            PreparedStatement preparedStatement = connection.prepareStatement(query);

            ResultSet resultSet;
            try {
               resultSet = preparedStatement.executeQuery();

               try {
                  if (resultSet.next()) {
                     int_val = resultSet.getInt("numerical_mode");
                  }
               } catch (Throwable var14) {
                  if (resultSet != null) {
                     try {
                        resultSet.close();
                     } catch (Throwable var13) {
                        var14.addSuppressed(var13);
                     }
                  }

                  throw var14;
               }

               if (resultSet != null) {
                  resultSet.close();
               }
            } catch (Throwable var15) {
               if (preparedStatement != null) {
                  try {
                     preparedStatement.close();
                  } catch (Throwable var12) {
                     var15.addSuppressed(var12);
                  }
               }

               throw var15;
            }

            if (preparedStatement != null) {
               preparedStatement.close();
            }

            query = "SELECT str_mode FROM pointing_mode_to_str WHERE numerical_mode = " + int_val;
            preparedStatement = connection.prepareStatement(query);

            try {
               resultSet = preparedStatement.executeQuery();

               try {
                  if (resultSet.next()) {
                     str_val = resultSet.getString("str_mode");
                  }
               } catch (Throwable var16) {
                  if (resultSet != null) {
                     try {
                        resultSet.close();
                     } catch (Throwable var11) {
                        var16.addSuppressed(var11);
                     }
                  }

                  throw var16;
               }

               if (resultSet != null) {
                  resultSet.close();
               }
            } catch (Throwable var17) {
               if (preparedStatement != null) {
                  try {
                     preparedStatement.close();
                  } catch (Throwable var10) {
                     var17.addSuppressed(var10);
                  }
               }

               throw var17;
            }

            if (preparedStatement != null) {
               preparedStatement.close();
            }
         } catch (Throwable var18) {
            if (connection != null) {
               try {
                  connection.close();
               } catch (Throwable var9) {
                  var18.addSuppressed(var9);
               }
            }

            throw var18;
         }

         if (connection != null) {
            connection.close();
         }
      } catch (SQLException var19) {
         str_val = var19.toString();
      }

      return str_val;
   }

   public Attribute onGetValue(Identifier identifier, Byte rawType) {
      if (this.connector == null) {
         return null;
      } else if ("PointingMode".equals(identifier.getValue())) {
         return (Attribute)HelperAttributes.javaType2Attribute(this.sqlGetMode());
      } else if ("X".equals(identifier.getValue())) {
         return (Attribute)HelperAttributes.javaType2Attribute("100.000000");
      } else if ("Y".equals(identifier.getValue())) {
         return (Attribute)HelperAttributes.javaType2Attribute("100.000000");
      } else {
         return "Debug".equals(identifier.getValue()) ? (Attribute)HelperAttributes.javaType2Attribute(DEBUG_VALUE) : null;
      }
   }

   public Boolean onSetValue(IdentifierList identifiers, ParameterRawValueList values) {
      return false;
   }

   public UInteger actionArrived(Identifier name, AttributeValueList attributeValues, Long actionInstanceObjId, boolean reportProgress, MALInteraction interaction) {
      if (this.connector == null) {
         return new UInteger(0L);
      } else if ("Debug".equals(name.getValue())) {
         if (attributeValues == null) {
            return new UInteger(1L);
         } else if (attributeValues.isEmpty()) {
            DEBUG_VALUE = this.sqlDebug("");
            return new UInteger(0L);
         } else if (attributeValues.size() == 1) {
            DEBUG_VALUE = this.sqlDebug(HelperAttributes.attribute2string(((AttributeValue)attributeValues.get(0)).getValue()));
            return new UInteger(0L);
         } else {
            return new UInteger(1L);
         }
      } else {
         return new UInteger(0L);
      }
   }
}