<?php

/**
 * Implements HOOK_form_alter().
 */
function diy_craftsman_form_alter(&$form, &$form_state, $form_id) {
  global $user;

  // Add automatic redirect to user profile form for craftsman
  if(in_array($form_id, array('user_profile_form'))) {
    if(_diy_craftsman_is_craftsman() && !diy_craftsman_get_branches($user->uid)) {
      if($form_id == 'user_profile_form') {
        $form['#submit'][] = 'diy_craftsman_custom_submit_profile_form';
      }
    }
  }
}

/**
 * Attaches redirect to profile form
 */
function diy_craftsman_custom_submit_profile_form($form, &$form_state) {
  $form_state['redirect'] = 'profile-anbieterprofil/' . $form['#user']->uid . '/edit';
}

/**
 * Retrievs current abo for given user id
 */
function diy_craftsman_get_abo($user_id = NULL) {
  if(!$user_id) {
    global $user;
    $user_id = $user->uid;
  }

  $abo_query = new EntityFieldQuery();

  $abo_query->entityCondition('entity_type', 'node')
    ->entityCondition('bundle', 'token_paket')
    ->propertyCondition('status', 1)
    ->propertyCondition('uid', $user_id)
    ->fieldCondition('field_abo', 'value', 1, '=')
    ->fieldCondition('field_ablaufdatum', 'value', time(), '>=')
    ->addTag('abo_not_cancelled');

  $result = $abo_query->execute();

  if (isset($result['node'])) {
    $keys = array_keys($result['node']);
    $first = reset($keys);
    if($abo = node_load($first)) {
      return $abo;
    }
  }

  return FALSE;
}

/**
 * Implements EFQ Tag for abo
 */
function diy_craftsman_query_abo_not_cancelled_alter(QueryAlterableInterface $query) {
  $query->leftJoin('field_data_field_cancelled', 'c', 'node.nid = c.entity_id');
  $query->isNull('c.field_cancelled_value');
}

/**
 * Returns true if given user has premium membership
 */
function diy_craftsman_is_premium($user_id = NULL) {
  if(!$user_id) {
    global $user;
    $user_id = $user->uid;
  }

  if($abo = diy_craftsman_get_abo($user_id)) {
    if($field_product_id = field_get_items('node', $abo, 'field_product_id')) {
      if(isset($field_product_id[0]['value']) && $field_product_id[0]['value'] == 5) {
        return TRUE;
      }
    }
  }

  return FALSE;
}

/**
 * Returns ids of craftsmans branches
 */
function diy_craftsman_get_branches($user_id) {
  $branch_query = new EntityFieldQuery();

  $branch_query->entityCondition('entity_type', 'node')
    ->entityCondition('bundle', 'branche')
    ->propertyCondition('status', 1)
    ->propertyCondition('uid', $user_id);

  $result = $branch_query->execute();

  if (isset($result['node'])) {
    return array_keys($result['node']);
  }

  return false;
}

/**
 * Returns ids of craftsmans branches
 */
function diy_craftsman_get_branches_active($user_id) {
  $branch_query = new EntityFieldQuery();

  $branch_query->entityCondition('entity_type', 'node')
    ->entityCondition('bundle', 'branche')
    ->fieldCondition('field_profil_verbergen', 'value', 2, '=')
    ->propertyCondition('status', 1)
    ->propertyCondition('uid', $user_id);

  $result = $branch_query->execute();

  if (isset($result['node'])) {
    return array_keys($result['node']);
  }

  return false;
}

function diy_craftsman_get_branche_tids($user_id) {
  if($branches = diy_craftsman_get_branches_active($user_id)) {
    $tids = array();

    foreach($branches as $branch) {
      $branche_node = node_load($branch);

      if($field_experience_parent = field_get_items('node', $branche_node, 'field_experience_parent')) {
        $tids[] = $field_experience_parent[0]['tid'];
      }
    }

    return $tids;
  }

  return array();
}

/**
 * Checks if current user is craftsman
 */
function _diy_craftsman_is_craftsman() {
  global $user;
  $full_user = user_load($user->uid);

  $field_craftsman = field_get_items('user', $full_user, 'field_anbieter');

  if(isset($field_craftsman[0]['value']) && $field_craftsman[0]['value'] == 1) {
    return true;
  }

  return false;
}

/**
 * Checks if current user is verified
 */
function _diy_craftsman_is_verified() {
  global $user;
  $full_user = user_load($user->uid);

  if($intern_profile = profile2_load_by_user($full_user, 'intern')) {
    if($field_identity_approved_by = field_get_items('profile2', $intern_profile, 'field_identity_approved_by')) {
      return true;
    }
  }

  return false;
}

/**
 * Returns machine name for profile type (eg: premium)
 */
function diy_craftsman_get_type($uid) {
  $user = user_load($uid);

  if(diy_craftsman_is_premium($uid)) {
    return 'premium';
  }

  if($anbieterprofil = profile2_load_by_user($user, 'anbieterprofil')) {
    if($field_nachbarschaftshilfe = field_get_items('profile2', $anbieterprofil, 'field_nachbarschaftshilfe')) {
      if(isset($field_nachbarschaftshilfe[0]['value'])) {
        if($field_nachbarschaftshilfe[0]['value'] == 1 || $field_nachbarschaftshilfe[0]['value'] == 0) {
          return 'hood';
        }
      }
    }
  }

  return 'normal';
}

/**
 * Returns human readable name for profile type
 */
function diy_craftsman_get_typestring_from_type($type) {
  switch($type) {
    case 'normal':
      return '';

    case 'premium':
      return t('professional craftsman');

    case 'hood':
      return t('hobbyist craftsman');

    default:
      return;
  }
}

/**
 * Generating full title like "Robert &gt; Tischler from 3071 Böheimkirchen"
 */
function diy_craftsman_get_full_title($user_id, $profession) {
  if(!$user_id) {
    global $user;
    $user_id = $user->uid;
  }

  $author = user_load($user_id);

  $username = $author->name;
  if($alias_name = field_get_items('user', $author, 'field_alias_name')) {
    $username = $alias_name[0]['value'];
  }

  $field_inserat_addresse = field_get_items('user', $author, 'field_inserat_addresse');
  return $username . ' &gt; <span class="address">' . t('@profession from @postalcode @city', array(
      '@username' => $username,
      '@postalcode' => $field_inserat_addresse[0]['postal_code'],
      '@city' => $field_inserat_addresse[0]['locality'],
      '@profession' => $profession
    )) . '</span>';
}

function diy_craftsman_contact_data($branche) {
  global $user;

  $anbieter_uid = $branche->uid;
  $branche_id = $branche->nid;

  // current user is not logged in
  if(!$user->uid) {

    $output = t('You have to be logged in to view this users contact data.');


    $output .= l(t('Login'), 'user/login',
      array(
        'query' => drupal_get_destination(),
        'attributes' => array(
          'class' => 'button'
        )
      )
    );

    return $output;
  }

  $anbieter = user_load($anbieter_uid);
  $profile2 = profile2_load_by_user($anbieter, 'anbieterprofil');
  $token_exists = _inserate_token_exists($user->uid, $anbieter_uid);

  $contactdata = '<div><span class="views-label email">'. t('Mail') .': </span>';
  $contactdata .= '<span>'. l($anbieter->mail, 'mailto: '.$anbieter->mail).'</span></div>';

  $phone_value = t('Not available');
  if($profile2 && $field_telefon = field_get_items('profile2', $profile2, 'field_kontakt_telefon')) {
    $phone_value = check_plain($field_telefon[0]['value']);
  }

  $contactdata.= '<div><span class="views-label telefon">'. t('Phone') .': </span>';
  $contactdata.= '<span>'. $phone_value .'</span></div>';

  if($token_exists || $anbieter_uid == $user->uid) {
    return $contactdata;
  }

  if(!$token_exists && $anbieter_uid != $user->uid)	{
    $oldest_package = _inserate_get_oldest_token();

    if ($oldest_package) {
      $redeem_token_link = l(t('Redeem token?'),
        'redeem_token_ajax/'.$oldest_package.'/'.$anbieter_uid.'/'.$branche_id,
        $options = array(
          'attributes' => array('class'=>'user_relationships_popup_link button'),
        ));

      $output = t("No token found.") . ' ' . $redeem_token_link;
    } else {
      $output = t('You need a token to view this users contact data!');
      $output .= l(t('Buy token'), 'node/add/token-paket', array('attributes' => array('class' => 'button')));
    }
  }

  return $output;
}

/*
 * Implements HOOK_profile2_update().
 */
function diy_craftsman_user_update(&$edit, $account, $category) {
  $field_inserat_addresse = field_get_items('user', $account, 'field_inserat_addresse');
  $field_inserat_addresse_org = field_get_items('user', $account->original, 'field_inserat_addresse');

  if($field_inserat_addresse && $field_inserat_addresse_org) {
    if($field_inserat_addresse[0]['postal_code'] != $field_inserat_addresse_org[0]['postal_code'] ||
       $field_inserat_addresse[0]['locality'] != $field_inserat_addresse_org[0]['locality']) {

      // there are changes in postal code and/or locality
      // check for all branches and update alias
      if($all_branches = diy_craftsman_get_branches($account->uid)) {

        foreach($all_branches as $branch) {
          _wspaths_create_alias(node_load($branch), $account);
        }
      }

    }
  }
}