#define MAXBUFFER 32
int relayPins[] = {2, 3, 4, 5};
String message = "";
String senderNumber;
int newLineCount = 0;
void setup() {
  // put your setup code here, to run once:
  for (int i = 0; i < 4 ; i = i + 1)
  {
    pinMode(relayPins[i], OUTPUT);
    delay(1000);
    digitalWrite(relayPins[i], HIGH);
    delay(1000);
  }
  Serial.begin(9600);
  Serial.setTimeout(10);
  Serial1.begin(9600);
  delay(100);
    Serial1.println("AT+CMGF=1");
    delay(100);
    Serial1.println("AT+CNMI=2,2,0,0,0");
    delay(100);
}
void loop() {
  if (Serial1.available() > 0) {
    message = Serial1.readString();
    message = process_message();
        if (message.indexOf("setLoad") > -1) {
          int loadNumber = message.substring(8, 9).toInt();
          String state = message.substring(10);
          if (doesLoadExist(loadNumber)) {
            sendNonExistentLoadSMS(senderNumber);
            } else {
              setLoad(loadNumber, state);
            }
        } else if (message.indexOf("getLoad") > -1) {
          int loadNumber = message.substring(8).toInt();
          int loadStatus = getLoad(loadNumber);
          if (doesLoadExist(loadNumber)) {
            sendNonExistentLoadSMS(senderNumber);
            } else {
              sendLoadStatus(loadNumber, loadStatus);
              }
        } else {
          sendInvalidCommandSMS(senderNumber);
          }
        }
    }
//void loop() {
//   put your main code here, to run repeatedly:
// while (Serial.available() > 0)
//    {
//      Serial1.write(Serial.read());
//    }
//    Serial.println("Connected!");
//    if (Serial.available() > 0) {
//      message = Serial.readStringUntil('\n');
//      }
//
//    Serial.println(message);
// while (Serial1.available() > 0)
// {
//   message = Serial1.readString();
//   char sms_char = Serial1.read();
//   if (sms_char == '\n') {
//     newLineCount += 1;
//   }
//   if (newLineCount < 3) {
//     message += sms_char;
//   }
//   else {
//     Serial.println(message);
//     Serial.println(newLineCount);
//     String command = process_message();
//     Serial.print("===>>>>");
//     Serial.println(command);
//     process_commands(command);
//     newLineCount = 0;
//   }
// }
//}
void sendInvalidCommandSMS(String senderNumber){
  Serial.println("AT+CMGF=1");
  delay(1000);
  Serial.println("AT+CMGF=\"" + senderNumber + "\"\r");
  delay(1000);
    Serial1.println("Command not supported.");
    delay(1000);
    Serial.write((char)26);
}
void sendNonExistentLoadSMS(String senderNumber){
  Serial.println("AT+CMGF=1");
  delay(1000);
  Serial.println("AT+CMGF=\"" + senderNumber + "\"\r");
  delay(1000);
    Serial1.println("Load not found.");
    delay(1000);
    Serial.write((char)26);
}
bool doesLoadExist(int loadNumber){
  for (int i = 0; i < sizeof(relayPins)/sizeof(relayPins[0]); i++) {
      if (relayPins[i] == loadNumber) {
        return true;
      }
    }
    return false;
}
void setLoad(int loadNumber, String intendedLoadState) {
  if (intendedLoadState.indexOf("ON") > -1){
    digitalWrite(loadNumber, LOW);
  } else if (intendedLoadState.indexOf("OFF") > -1) {
    digitalWrite(loadNumber, HIGH);
  }
}
int getLoad(int loadNumber){
  return digitalRead(loadNumber);
}
void sendLoadStatus(int loadNumber, int value) {
  Serial1.println("AT+CMGF=1\r\n");
  delay(1000);
  Serial1.println("AT+CMGS=\"" + senderNumber + "\"\r\n");
  delay(1000);
  Serial.println("===========");
  Serial.println(value);
  Serial.println("===========");
  if (value == 1) {
      // send load on
      String text = "Load ";
      text.concat(loadNumber);
      Serial1.println(text + " is ON");
      delay(1000);
  } else {
    // send load off
      String text = "Load ";
      text.concat(loadNumber);
      Serial1.println(text + " is OFF");
      delay(1000);
  }
  Serial1.write((char)26);
  delay(1000);
}
String process_message() {
  message.trim();
    if (message.startsWith("+CMT:")) {
//      Serial.println("The sms received is:");
//      Serial.println(message);
      String messageText = message.substring(message.lastIndexOf('"') + 1);
      messageText.trim();
      messageText.replace("", "");
    String messageSender = message.substring(message.indexOf('"') + 1,
message.indexOf('"') + 14);
    messageSender.trim();
    senderNumber = messageSender;
//     Serial.println("Sender: ");
//     Serial.println(messageSender);
//     Serial.println("Text:");
//     Serial.println(messageText);
     message = "" ;
    return messageText;
  }
  else {
    Serial.println("Invalid AT+CNMI format");
    Serial.println(message);
    message = "";
     return "";
  }
}
//void process_commands(String command){
// int loadNumber;
// String intendedLoadState;
// int stateTime = 0;
//
//if (command.length() ==0) {
// sendInvalidCommandSMS(senderNumber);
// return;
// }
// if (command.startsWith("setLoad")){
//    command.remove(0, 7);
//    if(command.toInt()==0){
//      sendInvalidCommandSMS(senderNumber);
//      return;
//      }
//      else{
//        loadNumber = command.toInt();
//        }
//        while(isDigit(command[0])){
//          command.remove(0, 1);
//          }
//          while(!isDigit(command[0])){
//            intendedLoadState += command[0];
//            command.remove(0,1);
//            if(command.length() == 0){
//              break;
//              }
//            }
//            if((intendedLoadState.equalsIgnoreCase("ON") == 0)&&
(intendedLoadState.equalsIgnoreCase("OFF") == 0)){
//              sendInvalidCommandSMS(senderNumber);
//              return;
//              }
//              else{
//                intendedLoadState = intendedLoadState.equalsIgnoreCase("ON");
//                }
//                if(command.length() > 0){
//                  stateTime = command.toInt();
//                  }
//                  if (doesLoadExist(loadNumber)){
//                     setLoad(loadNumber, intendedLoadState, stateTime);
//                     }
//                     else{
//                       sendNonExistentLoadSMS(senderNumber);
//                      return;
//                      }
//    }
//    else if (command.startsWith("getLoad")){
//      command.remove(0, 7);
//      if(command.toInt() == 0){
//        sendInvalidCommandSMS(senderNumber);
//        return;
//        }
//        loadNumber = command.toInt();
//        if (doesLoadExist(loadNumber)){
//          int value = getLoad(loadNumber);
//          sendLoadStatus(loadNumber, senderNumber, value);
//          }
//          else{
//              sendNonExistentLoadSMS(senderNumber);
//              return;
//            }
//    } else{
//          sendInvalidCommandSMS(senderNumber);
//          return;
//    }
//}