<?php

/**
 * Implementation of hook_menu().
 */
function commerce_devel_generate_menu() {
  $items = array();

  $items['admin/config/development/generate/product'] = array(
    'title' => 'Generate products',
    'description' => 'Generate a given number of products. Optionally delete current products.',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('commerce_devel_generate_products_form'),
    'access arguments' => array('administer commerce_product entities'),
  );
 $items['admin/config/development/generate/order'] = array(
    'title' => 'Generate orders',
    'description' => 'Generate a given number of orders.',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('commerce_devel_generate_orders_form'),
    'access arguments' => array('administer orders'),
  );

  return $items;
}

function commerce_devel_generate_products_form() {
  $options = array();

  $types = commerce_product_types();
  $suffix = '';
  foreach ($types as $type => $type_array) {
    $options[$type] = $type_array['name'];
  }

  if (empty($options)) {
    drupal_set_message(t('You do not have any product types that can be generated. <a href="@create-type">Go create a new content type</a> already!</a>', array('@create-type' => url('admin/structure/types/add'))), 'error', FALSE);
    return;
  }

  // Loop over fields to get commerce_product_reference fields.
  foreach (field_info_fields() as $field_name => $field) {
    if ($field['type'] == 'commerce_product_reference' && $field['module'] == 'commerce_product_reference') {
      if (isset($field['bundles']['node'])) {
        foreach ($field['bundles']['node'] as $node_bundle) {
          $bundle = node_type_load($node_bundle);
          $node_bundles[$node_bundle] = $bundle->name;
        }
      }
    }
  }

  $form['product_types'] = array(
    '#type' => 'checkboxes',
    '#title' => t('Product types'),
    '#options' => $options,
    '#default_value' => array_keys($options),
  );
  $form['kill_products'] = array(
    '#type' => 'checkbox',
    '#title' => t('<strong>Delete all products</strong> in these product types before generating new products.'),
    '#default_value' => FALSE,
  );
  if (isset($node_bundle)) {
    $form['generate_product_displays'] = array(
      '#type' => 'checkbox',
      '#title' => t('Generate product displays associated.'),
      '#default_value' => FALSE,
    );
    $form['node_types'] = array(
      '#type' => 'checkboxes',
      '#title' => t('Content types'),
      '#options' => $node_bundles,
      '#states' => array(
        'invisible' => array(
          'input[name="generate_product_displays"]' => array('checked' =>FALSE),
        ),
      ),
      '#default_value' => array_keys($node_bundles),
    );
  }
  $form['num_products'] = array(
    '#type' => 'textfield',
    '#title' => t('How many products would you like to generate?'),
    '#default_value' => 50,
    '#size' => 10,
  );

  // Build an options array of allowed currency values.
  $options = array();
  foreach (commerce_currencies(TRUE) as $currency_code => $currency) {
    $options[$currency_code] = t('@code - @name', array('@code' => $currency['code'], '@name' => $currency['name']));
  }

  $form['currency_code'] = array(
    '#title' => t('Currency code'),
    '#type' => 'select',
    '#default_value' => commerce_default_currency(),
    '#options' => $options,
  );
  $form['min_price'] = array(
    '#title' => t('Minimum price'),
    '#type' => 'textfield',
    '#default_value' => 0,
    '#element_validate' => array('_commerce_devel_generate_price_validate'),
    '#size' => 10,
  );
  $form['max_price'] = array(
    '#title' => t('Maximum price'),
    '#type' => 'textfield',
    '#default_value' => 50000,
    '#element_validate' => array('_commerce_devel_generate_price_validate'),
    '#size' => 10,
  );
  $form['title_length'] = array(
    '#type' => 'textfield',
    '#title' => t('Max word length of titles'),
    '#default_value' => 4,
    '#size' => 10,
  );

  unset($options);
  $options[LANGUAGE_NONE] = t('Language neutral');
  if (module_exists('locale')) {
    $options += locale_language_list();
  }
  $form['add_language'] = array(
    '#type' => 'select',
    '#title' => t('Set language on products'),
    '#multiple' => TRUE,
    '#disabled' => !module_exists('locale'),
    '#description' => t('Requires locale.module'),
    '#options' => $options,
    '#default_value' => array(LANGUAGE_NONE => LANGUAGE_NONE),
  );

  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Generate'),
  );
  $form['#redirect'] = FALSE;

  return $form;
}

/**
 * Validate function for the integer fields.
 */
function _commerce_devel_generate_price_validate($element, &$form_state) {
  if (!ctype_digit($element['#value'])) {
    form_error($element, t('The "!name" field has to be numeric.', array('!name' => t($element['#title']))));
  }
}

function commerce_devel_generate_products_form_submit($form_id, &$form_state) {
  module_load_include('inc', 'commerce_devel_generate', 'devel_generate');
  $form_state['values']['product_types'] = array_filter($form_state['values']['product_types']);
  if ($form_state['values']['num_products'] <= 50) {
    commerce_devel_generate_products($form_state);
  }
  else {
    module_load_include('inc', 'commerce_devel_generate', 'devel_generate_batch');
    commerce_devel_generate_batch_products($form_state);
  }
  // Create product displays.
  if (isset($form_state['values']['node_types']) && !empty($form_state['values']['generate_product_displays'])) {
    module_load_include('inc', 'commerce_devel_generate', 'commerce_product_reference.devel_generate');
    module_load_include('inc', 'devel_generate', 'devel_generate');
    $form_state['values']['node_types'] = array_filter($form_state['values']['node_types']);
    $form_state['values']['num_nodes'] = $form_state['values']['num_products'];
    $form_state['values']['kill_content'] = 0;
    if ($form_state['values']['num_nodes'] <= 50) {
      module_load_include('inc', 'devel_generate');
      devel_generate_content($form_state);
    }
    else {
      module_load_include('inc', 'devel_generate', 'devel_generate_batch');
      devel_generate_batch_content($form_state);
    }
  }
}


/**
 * Pre-process the devel_generate_content_form request.  This is needed so
 * batch api can get the list of users once.
 *
 * @param $num
 *   array of options obtained from devel_generate_products_form.
 */
function commerce_devel_generate_products_pre_product(&$results) {
  module_load_include('inc', 'devel_generate');
  // Get user id.
  $users = devel_get_users();
  $users = array_merge($users, array('0'));
  $results['users'] = $users;
}

function commerce_devel_generate_orders_form() {
  $statuses = array();
  foreach (commerce_order_statuses() as $order_status) {
    $statuses[$order_status['name']] = $order_status['title'];
  }

  $methods = array();
  foreach (commerce_payment_methods() as $method_id => $payment_method) {
    $methods[$method_id] = $payment_method['title'];
  }

  $form['amount'] = array(
    '#title' => t('How many orders would you like to generate?'),
    '#type' => 'textfield',
    '#default_value' => 10,
    '#size' => 10,
  );

  $form['kill_orders'] = array(
    '#title' => t('Delete all orders before batch creating new ones'),
    '#type' => 'checkbox',
  );
  $form['kill_transactions'] = array(
    '#title' => t('Delete all transactions associated with the deleted orders'),
    '#type' => 'checkbox',
  );

  $form['order_statuses'] = array(
    '#type' => 'select',
    '#title' => t('Which possible order statuses should the orders have?'),
    '#default_value' => array('completed'),
    '#options' => $statuses,
    '#multiple' => TRUE,
  );

  $form['min_products'] = array(
    '#title' => t("What's the minimum amount of products contained in one order?"),
    '#type' => 'textfield',
    '#default_value' => 1,
    '#size' => 10,
  );
  $form['max_products'] = array(
    '#title' => t("What's the maximum amount of products contained in one order?"),
    '#type' => 'textfield',
    '#default_value' => 10,
    '#size' => 10,
  );

  $form['period'] = array(
    '#type' => 'fieldset',
    '#title' => t('Time period'),
    '#description' => t('The time period the generated orders should fall in.'),
  );
  $form['period']['start'] = array(
    '#type' => 'date',
    '#title' => 'Start',
    '#default_value' => array(
      'day' => format_date(REQUEST_TIME, 'custom', 'j'),
      'month' => format_date(REQUEST_TIME, 'custom', 'n'),
      'year' => format_date(REQUEST_TIME, 'custom', 'Y') - 1,
    ),
  );
  $form['period']['end'] = array(
    '#type' => 'date',
    '#title' => 'End',
  );

  $form['transactions'] = array(
    '#type' => 'fieldset',
    '#title' => t('Transactions'),
    '#collapsible' => TRUE,
    '#collapsed' => TRUE,
  );
  $form['transactions']['create_transactions'] = array(
    '#title' => t('Create transactions for the individual orders'),
    '#type' => 'checkbox',
  );
  $form['transactions']['payment_method'] = array(
    '#type' => 'select',
    '#title' => t('Which possible payment methods should transactions have?'),
    '#default_value' => array_keys($methods),
    '#options' => $methods,
    '#multiple' => TRUE,
  );

  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Generate'),
  );
  $form['#redirect'] = FALSE;

  return $form;
}

function commerce_devel_generate_orders_form_validate($form, &$form_state) {
  $amount = intval($form_state['values']['amount']);
  $upper = intval($form_state['values']['max_products']);
  $lower = intval($form_state['values']['min_products']);

  if ($amount < 1) {
    form_set_error('amount', t('You have to generate at least one order.'));
  }

  if ($upper < 0) {
    form_set_error('max_products', t('You must set a valid upperbound on the amount of products per order.'));
  }

  if ($lower < 0) {
    form_set_error('min_products', t('You must set a valid lowerbound on the amount of products per order.'));
  }

  if (($lower > $upper) && ($upper != 0)) {
    form_set_error('min_products', t('The minimum amount should be less than the maximum amount.'));
  }

  if (!count($form_state['values']['order_statuses'])) {
    form_set_error('order_statuses', t('At least one possible order status should be selected.'));
  }

  if ($form_state['values']['create_transactions'] && !count($form_state['values']['payment_method'])) {
    form_set_error('payment_method', t('At least one possible payment method should be selected if you wish to create transaction for each order.'));
  }
}

function commerce_devel_generate_orders_form_submit($form_id, &$form_state) {
  module_load_include('inc', 'commerce_devel_generate', 'devel_generate');
  module_load_include('inc', 'commerce_devel_generate', 'devel_generate_batch');
  commerce_devel_generate_batch_orders($form_state);
}
