/*
  Copyright 2014 DataStax

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
*/

#include "prepare_handler.hpp"
#include "constants.hpp"
#include "response.hpp"
#include "prepare_request.hpp"
#include "error_response.hpp"
#include "execute_request.hpp"
#include "request_handler.hpp"
#include "batch_request.hpp"
#include "result_response.hpp"

namespace cass {

bool PrepareHandler::init(const std::string& prepared_id) {
  PrepareRequest* prepare =
      static_cast<PrepareRequest*>(new PrepareRequest());
  request_.reset(prepare);
  if (request_handler_->request()->opcode() == CQL_OPCODE_EXECUTE) {
    const ExecuteRequest* execute = static_cast<const ExecuteRequest*>(
        request_handler_->request());
    prepare->set_query(execute->prepared_statement());
    return true;
  } else if (request_handler_->request()->opcode() == CQL_OPCODE_BATCH) {
    const BatchRequest* batch = static_cast<const BatchRequest*>(
        request_handler_->request());
    std::string prepared_statement;
    if (batch->prepared_statement(prepared_id, &prepared_statement)) {
      prepare->set_query(prepared_statement);
      return true;
    }
  }
  return false; // Invalid request type
}

void PrepareHandler::on_set(ResponseMessage* response) {
  switch (response->opcode()) {
    case CQL_OPCODE_RESULT: {
      ResultResponse* result =
          static_cast<ResultResponse*>(response->response_body().get());
      if (result->kind() == CASS_RESULT_KIND_PREPARED) {
        request_handler_.release()->retry(RETRY_WITH_CURRENT_HOST);
      } else {
        request_handler_.release()->retry(RETRY_WITH_NEXT_HOST);
      }
    } break;
    case CQL_OPCODE_ERROR:
      request_handler_.release()->retry(RETRY_WITH_NEXT_HOST);
      break;
    default:
      break;
  }
}

void PrepareHandler::on_error(CassError code, const std::string& message) {
  request_handler_.release()->retry(RETRY_WITH_NEXT_HOST);
}

void PrepareHandler::on_timeout() {
  request_handler_.release()->retry(RETRY_WITH_NEXT_HOST);
}

} // namespace cass
