<?php

/**
 * @file
 * Token processing for social media
 */

function socialmedia_token_info() {
  $type = array(
    'name' => t('Social media'), 
    'description' => t('Tokens related to social media sites.'), 
    //'needs-data' => 'socialmedia',
  );
  $tokens = array(
    'socialmedia' => array(),
    'site' => array(),
    'user' => array(), 
    'current-page' => array(), 
  );

  $profiles = socialmedia_platform_definitions();
  foreach ($profiles AS $platform => $data) {
    if (is_array($data['tokens'])) {
      foreach ($data['tokens'] AS $ttype => $tdata) {
        if ($ttype == 'multi') {
          foreach ($tdata AS $key => $ttdata) {
            $tokens['socialmedia']['sm-' . $key] = $ttdata;
            $tokens['site']['sm-' . $key] = $ttdata;
            $tokens['user']['sm-' . $key] = $ttdata;
          }
        }
        else {
          foreach ($tdata AS $key => $ttdata) {
            $tokens[$ttype]['sm-' . $key] = $ttdata;
          }
        }
      } 
    }
  }
  /*
  // Core tokens for nodes.
  $socialmedia['twitter_profile_url'] = array(
    'name' => t("Twitter profile url"), 
    'description' => t("URL to twitter profile."),
  );
  */
  
  $platforms = socialmedia_icon_platforms();
  foreach ($platforms AS $platform => $name) {
    $tokens['socialmedia']['sm-' . $platform . '_icon-path:?'] = array(
      'name' => t('@platform icon path', array('@platform' => $name)),
      'description' => t("The path to the @platform icon", array('@platform' => $name)),
    );
  }
  
  $defaults = array(
    'width' => t('Default width'),
    'height' => t('Default height'),
    'color_body_background' => t('Default body background color'),
    'color_body_background' => t('Default body background color'),
    'color_body_text' => t('Default body text color'),
    'color_body_linktext' => t('Default body linktext color'),
    'color_header_background' => t('Default header background color'),
    'color_header_text' => t('Default header text color'),
    'color_border' => t('Default border color'),
    'link_target_profile' => t('Default target attribute for profile links'),
    'link_target_sharing' => t('Default target attribute for sharing links'),
    'link_rel_profile' => t('Default rel attribute for profile links'),
    'link_rel_sharing' => t('Default rel attribute for sharing links'),
    'link_class_profile' => t('Default class attribute for profile links'),
    'link_class_sharing' => t('Default class attribute for sharing links'),
  );
  foreach ($defaults AS $key => $value) {
    $tokens['socialmedia']['sm-default-' . $key] = array(
      'name' => $value,
      'description' => $value . ' ' . t('values set in social media config.'),
    );    
  }
  
  $tokens['current-page']['title-plain'] = array(
    'name' => t('The plain title of the current page.'),
    'description' => t('The title of the current page stripped of HTML'),
  );

  
  $info =  array(
    'types' => array('socialmedia' => $type), 
    'tokens' => array(
      'socialmedia' => $tokens['socialmedia'],
      //'usersite' => $tokens['usersite'],
      'site' => $tokens['site'],
      'user' => $tokens['user'],
      'current-page' => $tokens['current-page'],
    ),
  );
  return $info;
}

function socialmedia_tokens($type, $tokens, array $data = array(), array $options = array()) {
  $replacements = array();
  if ($type == 'current-page') {
    if (isset($tokens['title-plain'])) {
      $replacements[$tokens['title-plain']] = strip_tags(drupal_get_title());
    }
  }
  if (($type == 'site') || ($type == 'user') || ($type == 'socialmedia')) {

    //$uid = (($type == 'user') && isset($data['user']->uid)) ? $data['user']->uid : 0; 
    foreach ($tokens as $name => $original) {
      if (strpos($name, 'sm-') === 0) {
        list($platform_name, $hash) = explode('_', substr($name, 3), 2);
        // process icon paths
        if (strpos($platform_name, 'default') === 0) {
          $replacements[$original] = socialmedia_default_tokens($hash);
          continue;         
        }
        if ((strpos($hash, 'icon-path') === 0) || (strpos($hash, 'icon-markup') === 0)) {
          $mode = (strpos($hash, 'icon-path') === 0) ? 'path' : 'markup';
          $replacements[$original] = socialmedia_icon_tokens($platform_name, $hash, $mode);
          continue;
        }
        $profile = NULL;
        // if token has user context, load the profiles for the user        
        $profile_context = (isset($data['set']['data']['socialmedia']['profile_context'])) ? $data['set']['data']['socialmedia']['profile_context'] : 'usersite';
        if ((strpos($profile_context, 'user') !== FALSE)
          && (($type == 'user') || ($type == 'socialmedia'))) {
          $uid = socialmedia_get_context_author_uid($data);
          if (isset($uid) && $uid) {
            $profile = socialmedia_profile_load($platform_name, $uid);
          }
        }
        // if site context or user profile not found, load site profile
        $load_site_profile = 0;
        if ((strpos($profile_context, 'site') !== FALSE)
          && (($type == 'site') || ($type == 'socialmedia'))) {
          if ($profile_context == 'site') {
            $load_site_profile = 1;
          }
          // if profile_context = usersite and profile from user not set
          else if (($profile_context != 'user') && (!isset($profile['result']) || !$profile['result'])) {
            $load_site_profile = 1;
          }
        }
        if ($load_site_profile) {
          $profile = socialmedia_profile_load($platform_name, 0);
        }
        $platform = socialmedia_platform_definition_load($platform_name);

        $replacement = call_user_func($platform['tokens callback'], $hash, $profile);

        if (!isset($replacement) || $replacement === FALSE) {
          $msg = t('You are trying to use a social media %platform profile token but the profile has not been set. !link',
            array(
              '%platform' => $platform['title'],
              '!link' => l(t('Set @platform profile.', array('@platform' => $platform['title'])), 'admin/config/media/socialmedia')
            )
          );
          //_socialmedia_widgets_set_error($data['widgets']['element'], $msg);
          _socialmedia_widgets_set_error($data['set']['name'] . ':' . $data['widgets']['element']['name'], '');
        }
        else {
          $replacements[$original] = $replacement;
        }
      }
    }
  }

  return $replacements;
}

function socialmedia_default_tokens($hash) {
  return variable_get('socialmedia_default_' . $hash, constant('SOCIALMEDIA_' . strtoupper($hash) . '_DEFAULT'));
}

function socialmedia_icon_tokens($platform_name, $hash, $mode) {
  $b = explode(':', $hash);
  $iconsets = socialmedia_iconset_info();
  if (isset($b[1])) {
    $s = $b[1];
  }
  else {
    $s = variable_get('socialmedia_icon_default_style', SOCIALMEDIA_ICON_DEFAULT_STYLE_DEFAULT);
  }
  if (!$s) {
    $msg = t('You are trying to use a social media icon token but no default icon style has been set. !link',
      array(
        '!link' => l(t('Set default icon style.'), 'admin/config/media/socialmedia')
      )
    );
    _socialmedia_widgets_set_error('set', $msg);
    return '';
  }
  list($iconset, $style) = explode(':', $s);

  if (($mode == 'path') && isset($iconsets[$iconset]['path callback'])) {
    return base_path() . call_user_func($iconsets[$iconset]['path callback'], $platform_name, $style);
  }
  else if (($mode == 'markup') && isset($iconsets[$iconset]['markup callback'])) {
    return call_user_func($iconsets[$iconset]['markup callback'], $platform_name, $style);
  }
  return '<none>';
}