/*
 * Copyright 2016 The Android Open Source Project
 *
 * 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 "poc_test.h"

#include <getopt.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include <iostream>
#include <sstream>

using std::cout;
using std::cerr;
using std::endl;
using std::map;
using std::string;

static struct option long_options[] = {
  {"device_model", required_argument, 0, 'd'},
  {"params", required_argument, 0, 'p'}
};

static DeviceModel TranslateDeviceModel(const char *model_name) {
  DeviceModel device_model;
  if (!strcmp("Nexus 5", model_name)) {
      device_model = NEXUS_5;
  } else if (!strcmp("Nexus 5X", model_name)) {
      device_model = NEXUS_5X;
  } else if (!strcmp("Nexus 6", model_name)) {
      device_model = NEXUS_6;
  } else if (!strcmp("Nexus 6P", model_name)) {
      device_model = NEXUS_6P;
  } else if (!strcmp("Pixel", model_name)) {
      device_model = PIXEL;
  } else if (!strcmp("Pixel XL", model_name)) {
      device_model = PIXEL_XL;
  } else {
      device_model = OTHER;
  }
  return device_model;
}

static map<string, string> ExtractParams(const char *test_params) {
  map<string, string> params;
  string input(test_params);
  std::istringstream iss(input);

  string key_value;
  while(std::getline(iss, key_value, ',')) {
    size_t delim = key_value.find('=');
    if (delim == string::npos) {
      cerr << "Missing '=' delimiter.\n";
      exit(POC_TEST_SKIP);
    }

    string key = key_value.substr(0, delim);
    string value = key_value.substr(delim + 1);

    params[key] = value;
  }

  return params;
}

VtsHostInput ParseVtsHostFlags(int argc, char *argv[]) {
  VtsHostInput host_input;
  int opt = 0;
  int index = 0;
  while ((opt = getopt_long_only(argc, argv, "", long_options, &index)) != -1) {
    switch(opt) {
      case 'd':
        host_input.device_model = TranslateDeviceModel(optarg);
        break;
      case 'p':
        host_input.params = ExtractParams(optarg);
        break;
      default:
        cerr << "Wrong parameters.\n";
        exit(POC_TEST_SKIP);
    }
  }
  return host_input;
}