<?php

class GalleriesController_bwg {
  /**
   * @var $model
   */
  private $model;
  /**
   * @var $view
   */
  private $view;
  /**
   * @var string $page
   */
  private $page;
  /**
   * @var int $items_per_page
   */
  private $items_per_page = 20;
  /**
   * @var array $actions
   */
  private $actions = array();

  public function __construct() {
    // Allowed upload mime_types.
    add_filter('upload_mimes', array(BWG(), 'allowed_upload_mime_types'), 10, 2);
    $this->model = new GalleriesModel_bwg();
    $this->view = new GalleriesView_bwg();
    $this->page = WDWLibrary::get('page');

    $this->actions = array(
      'publish' => array(
        'title' => __('Publish', BWG()->prefix),
        'bulk_action' => __('published', BWG()->prefix),
      ),
      'unpublish' => array(
        'title' => __('Unpublish', BWG()->prefix),
        'bulk_action' => __('unpublished', BWG()->prefix),
      ),
      'duplicate' => array(
        'title' => __('Duplicate', BWG()->prefix),
        'bulk_action' => __('duplicated', BWG()->prefix),
      ),
      'delete' => array(
        'title' => __('Delete', BWG()->prefix),
        'bulk_action' => __('deleted', BWG()->prefix),
      ),
    );

    $user = get_current_user_id();
    $screen = get_current_screen();
    if ( !empty($screen) ) {
      $option = $screen->get_option('per_page', 'option');
      $this->items_per_page = get_user_meta($user, $option, TRUE);
      if ( empty ($this->items_per_page) || $this->items_per_page < 1 ) {
        $this->items_per_page = $screen->get_option('per_page', 'default');
      }
    }
    do_action('bwg_before_init_gallery');
  }

  /**
   * Execute.
   */
  public function execute() {
    $task = WDWLibrary::get('task');
    $id = WDWLibrary::get('current_id', 0, 'intval');
    if ( $task != 'display' && method_exists($this, $task) ) {
      if ( $task != 'edit' ) {
        check_admin_referer(BWG()->nonce, BWG()->nonce);
      }
      $action = WDWLibrary::get('bulk_action', '-1');
      $image_action = WDWLibrary::get('image_bulk_action', '-1');
      if ( $action != '-1' ) {
        $this->bulk_action($action);
      }
      elseif ( $image_action != '-1' ) {
        $this->image_bulk_action($image_action);
      }
      else {
        $this->$task($id);
      }
    }
    else {
      $this->display();
    }
  }

  /**
   * Display.
   */
  public function display() {
    // Set params for view.
    $params = array();
    $params['page'] = $this->page;
    $params['page_title'] = __('Galleries', BWG()->prefix);
    $params['actions'] = $this->actions;
    $params['order'] = WDWLibrary::get('order', 'asc');
    $params['orderby'] = WDWLibrary::get('orderby', 'order');
    if ( $params['orderby'] != 'order' ) {
        WDWLibrary::set_sorting( array('list_type'=>'galleries', 'order_by' => $params['orderby'].'_'.$params['order']) );
    } else {
        $sorting = WDWLibrary::get_sorting( array('list_type'=>'galleries') );
        $sorting = explode("_", $sorting);
        $params['orderby'] = isset($sorting[0]) ? $sorting[0] : 'order';
        $params['order'] = isset($sorting[1]) ? $sorting[1] : 'asc';
    }
    // To prevent SQL injections.
    $params['order'] = ($params['order'] == 'desc') ? 'desc' : 'asc';
    if ( !in_array($params['orderby'], array( 'name', 'author' )) ) {
      $params['orderby'] = 'order';
    }
    $params['items_per_page'] = $this->items_per_page;
    $page = WDWLibrary::get('paged', 1, 'intval');
    if ( $page < 0 ) {
      $page = 1;
    }
    $page_num = $page ? ($page - 1) * $params['items_per_page'] : 0;
	  $params['paged'] = $page;
    $params['page_num'] = $page_num;
    $params['search'] = WDWLibrary::get('s');

    $params['total'] = $this->model->total($params);
    $params['rows'] = $this->model->get_rows_data($params);

    $url_arg = array();
    $page_url = add_query_arg(array(
                                'page' => $this->page,
                                BWG()->nonce => wp_create_nonce(BWG()->nonce),
                              ), admin_url('admin.php'));

    $page_url = add_query_arg($url_arg, $page_url);
    $params['page_url'] = $page_url;
	  $params['galleries_ordering_ajax_url'] = add_query_arg( array(
									'action' => 'galleries_' . BWG()->prefix,
									'task' => 'ordering',
									BWG()->nonce => wp_create_nonce(BWG()->nonce),
								), admin_url('admin-ajax.php') );

    // Delete images without gallery.
    $this->model->delete_unknown_images();

    $this->view->display($params);
  }

  /**
   * Bulk actions.
   *
   * @param $task
   */
  public function bulk_action($task) {
    $message = 0;
    $successfully_updated = 0;
    $url_arg = array('page' => $this->page,'task' => 'display');
    $check = WDWLibrary::get('check');
    $all = WDWLibrary::get('check_all_items');
    $all = ($all == 'on' ? TRUE : FALSE);

    if ( method_exists($this, $task) ) {
      if ( $all ) {
        $get_excludeIds = WDWLibrary::get('ids_exclude', FALSE);
        $excludeIds = ( !empty($get_excludeIds) ) ? explode(',', $get_excludeIds) : array();
        $message = $this->$task(0, TRUE, TRUE, $excludeIds);
        $url_arg['message'] = $message;
      }
      else {
        if ( $check ) {
          foreach ( $check as $form_id => $item ) {
            $message = $this->$task($form_id, TRUE);
            if ( $message != 2 ) {
              // Increase successfully updated items count, if action doesn't failed.
              $successfully_updated++;
            }
          }
        }
        if ( $successfully_updated ) {
          $message = sprintf(_n('%s item successfully %s.', '%s items successfully %s.', $successfully_updated, BWG()->prefix), $successfully_updated, $this->actions[$task]['bulk_action']);
        }
        $key = ($message === 2 ? 'message' : 'msg');
        $url_arg[$key] = $message;
      }
    }

   WDWLibrary::redirect(add_query_arg($url_arg, admin_url('admin.php')));
  }

  /**
   * Delete.
   *
   * @param      $id
   * @param bool $bulk
   * @param bool $all
   * @param array $excludeIds
   *
   * @return int
   */
  public function delete( $id, $bulk = FALSE, $all = FALSE, $excludeIds = array() ) {
    $message = $this->model->delete($id, $all, $excludeIds);
    if ( $bulk ) {
      return $message;
    }

    WDWLibrary::redirect( add_query_arg(array(
                                         'page' => $this->page,
                                         'task' => 'display',
                                         'message' => $message,
                                       ), admin_url('admin.php')) );
  }

  /**
   * Publish.
   *
   * @param $id
   * @param bool $bulk
   * @param bool $all
   * @param array $excludeIds
   *
   * @return int
   */
  public function publish( $id, $bulk = FALSE, $all = FALSE, $excludeIds = array() ) {
    global $wpdb;
    $where = ($all ? '' : ' WHERE id=%d');
    if ( $where != '' ) {
      $query = $wpdb->prepare('UPDATE `' . $wpdb->prefix . 'bwg_gallery` SET published=1' . $where, $id);
      $updated = $wpdb->query( $query );
    }
    else {
      if ( !empty($excludeIds) ) {
        $where = ' WHERE `id` NOT IN (' . WDWLibrary::escape_array($excludeIds) . ')';
      }
      $query = 'UPDATE `' . $wpdb->prefix . 'bwg_gallery` SET published=1' . $where;
      $updated = $wpdb->query( $query );
    }
    if ( $updated !== FALSE ) {
      $message = 9;
    }
    else {
      $message = 2;
    }

    if ( $bulk ) {
      return $message;
    }
    else {
      WDWLibrary::redirect(add_query_arg(array(
                                           'page' => $this->page,
                                           'task' => 'display',
                                           'message' => $message,
                                         ), admin_url('admin.php')));
    }
  }

  /**
   * Unpublish.
   *
   * @param $id
   * @param bool $bulk
   * @param bool $all
   * @param array $excludeIds
   *
   * @return int
   */
  public function unpublish( $id, $bulk = FALSE, $all = FALSE, $excludeIds = array() ) {
    global $wpdb;
    $where = ($all ? '' : ' WHERE id=%d');
    if ( $where != '' ) {
        $query = $wpdb->prepare('UPDATE `' . $wpdb->prefix . 'bwg_gallery` SET published=0' . $where, $id);
        $updated = $wpdb->query( $query );
    }
    else {
      if ( !empty($excludeIds) ) {
        $where = ' WHERE `id` NOT IN (' . WDWLibrary::escape_array($excludeIds) . ')';
      }
      $query = 'UPDATE `' . $wpdb->prefix . 'bwg_gallery` SET published=0' . $where;
      $updated = $wpdb->query( $query );
    }
    if ( $updated !== FALSE ) {
      $message = 10;
    }
    else {
      $message = 2;
    }

    if ( $bulk ) {
      return $message;
    }
    else {
      WDWLibrary::redirect(add_query_arg(array(
                                           'page' => $this->page,
                                           'task' => 'display',
                                           'message' => $message,
                                         ), admin_url('admin.php')));
    }
  }

  /**
   * Duplicate by id.
   *
   * @param      $id
   * @param bool $bulk
   * @param bool $all
   * @param array $excludeIds
   *
   * @return int
  */
  
  public function duplicate( $id, $bulk = FALSE, $all = FALSE, $excludeIds = array() ) {
    $message_id = $this->model->duplicate($id, $all, $excludeIds);
    if ($bulk) {
      return $message_id;
    }
    WDWLibrary::redirect(add_query_arg(array(
      'page' => $this->page,
      'task' => 'display',
      'message' => $message_id,
    ), admin_url('admin.php')));
  }

  /**
   * Add/Edit.
   *
   * @param int $id
   * @param array $message
   */
  public function edit( $id = 0, $message = array() ) {
    $row = $this->model->get_row_data($id);
    if ( $id && empty($row->slug) ) {
      WDWLibrary::redirect(add_query_arg(array(
                                           'page' => $this->page,
                                           'task' => 'display',
                                         ), admin_url('admin.php')));
    }
    // Set params for view.
    $params = array();
    $params['id'] = $id;
    $params['row'] = $row;
    $params['form_action'] = add_query_arg(array(
                                             'page' => $this->page,
                                             'current_id' => $id,
                                             BWG()->nonce => wp_create_nonce($this->page),
                                           ), admin_url('admin.php'));
    $params['add_preview_image_action'] = add_query_arg(array(
                                                          'action' => 'addImages',
                                                          'bwg_width' => '800',
                                                          'bwg_height' => '550',
                                                          'callback' => 'bwg_add_preview_image',
                                                          BWG()->nonce => wp_create_nonce('addImages'),
                                                          'TB_iframe' => '1',
                                                        ), admin_url('admin-ajax.php'));
    $params['add_images_action'] = add_query_arg(array(
                                                   'action' => 'addImages',
                                                   'bwg_width' => '0',
                                                   'bwg_height' => '0',
                                                   'callback' => 'bwg_add_image',
                                                   BWG()->nonce => wp_create_nonce('addImages'),
                                                   'TB_iframe' => '1',
                                                 ), admin_url('admin-ajax.php'));
    $params['add_tags_action'] = add_query_arg(array(
                                                 'action' => 'addTags_' . BWG()->prefix,
                                                 'bwg_width' => '785',
                                                 'bwg_height' => '550',
                                                 BWG()->nonce => wp_create_nonce('addTags_' . BWG()->prefix),
                                               ), admin_url('admin-ajax.php'));
    $params['preview_action'] = WDWLibrary::get_custom_post_permalink(array(
                                                                        'slug' => $params['row']->slug,
                                                                        'post_type' => 'gallery',
                                                                      ));
    $params['shortcode_id'] = WDWLibrary::get_shortcode_id( array('slug' => $params['row']->slug, 'post_type' => 'gallery' ));
    $params['instagram_post_gallery'] = $params['row']->gallery_type == 'instagram_post' ? TRUE : FALSE;
    $params['facebook_post_gallery'] = (!$params['instagram_post_gallery']) ? ($params['row']->gallery_type == 'facebook_post' ? TRUE : FALSE) : FALSE;
    $params['gallery_type'] = ($params['row']->gallery_type == 'instagram' || $params['row']->gallery_type == 'instagram_post') ? 'instagram' : (($params['row']->gallery_type == 'facebook_post' || $params['row']->gallery_type == 'facebook') ? 'facebook' : $params['row']->gallery_type);

    // Image display params.
    $params['actions'] = WDWLibrary::image_actions( $params['gallery_type'] );
    $params['page_url'] = $params['form_action'];
    $order_by = WDWLibrary::get('order_by', '');
    if ( $order_by != '' && array_key_exists($order_by, WDWLibrary::admin_images_ordering_choices()) ) {
      WDWLibrary::set_sorting( array('gallery_id' => $id, 'list_type' => 'edit', 'order_by' => $order_by) );
    }
    $order_by = WDWLibrary::get_sorting( array('gallery_id' => $id, 'list_type' => 'edit') );
    $order_by = explode('_', $order_by);
    $params['order'] = $order_by[1];
    $params['orderby'] = $order_by[0];
    $params['items_per_page'] = $this->items_per_page;
    $page = WDWLibrary::get('paged', 1, 'intval');
    // In case of "Select All" removal, when there is an exception, you need to reset "page".
    $select_all = WDWLibrary::get('check_all_items', FALSE);
    $image_action = WDWLibrary::get('image_bulk_action', '-1');
    if ( $select_all && !empty($image_action) && $image_action == 'image_delete' ) {
      $page = 1;
    }
    if ( $page < 0 ) {
      $page = 1;
    }
    $page_num = $page ? ($page - 1) * $params['items_per_page'] : 0;
    $params['page_num'] = $page_num;
    $params['search'] = WDWLibrary::get('s');
    $params['message'] = $message;
    $params['total'] = $this->model->image_total($id, $params);
    $params['rows'] = $this->model->get_image_rows_data($id, $params);
    $params['pager'] = 0;
    $params['facebook_embed'] = $this->get_facebook_embed();

    $gallery_types = array('' => __('Mixed', BWG()->prefix), 'instagram' => __('Instagram only', BWG()->prefix));
    if ( has_action('init_display_facebook_gallery_options_bwg') && $id != 0 ) {
      $gallery_types['facebook'] = __('Facebook', BWG()->prefix);
    }
    $params['gallery_types'] = apply_filters('bwg_get_gallery_types', $gallery_types);

    $this->view->edit( $params );
  }

  /**
   * Save.
   *
   * @param $id
   * @param boolean $all
   */
  public function save( $id = 0, $all = FALSE ) {
    $data = $this->model->save();
    $message = array('gallery_message' => $data['saved'], 'image_message' => '');

    $ajax_task = WDWLibrary::get('ajax_task');
    if ( $ajax_task !== '' ) {
      if ( method_exists($this->model, $ajax_task) ) {
        $image_id = WDWLibrary::get('image_current_id', 0);
        if ( strpos($image_id, 'pr_') === 0 ) {
          $action_image_id = isset($data['action_image_id'][$image_id]) ? $data['action_image_id'][$image_id] : 0;
        }
        $ids_string = WDWLibrary::get('ids_string', 0);
        $ids = explode(',', $ids_string);
        /* Getting from ajax last message id as we are loosing success message on second iteration */
        $message['image_message'] = WDWLibrary::get('bwg_action_last_message', '', 'intval');
        /* check if image_id is not defined in the portion 50 ids_string skip ajax_task action */
        if ( in_array($image_id, $ids) ) {
          if ( !empty($action_image_id) ) {
            $image_id = $action_image_id;
          }
          $message['image_message'] = $this->model->$ajax_task($image_id, $data['id'], $all);
        }
      }
    }

    $this->edit($data['id'], $message);
  }

  /**
   * Bulk actions for images.
   *
   * @param string $image_action
   */
  public function image_bulk_action($image_action) {
    // Save gallery and images.
    $data = $this->model->save($image_action);
    $message = array('image_message' => $data['image_message']);
    $this->edit($data['id'], $message);
  }

  public function check_pricelist() {
    global $wpdb;
    $gallery_id = WDWLibrary::get('current_id', 0, 'intval');
    $not_set_items = array();
    if ( $gallery_id ) {
      $rows = $wpdb->get_results($wpdb->prepare('SELECT T_IMAGES.thumb_url, T_PRICELISTS.item_longest_dimension, T_IMAGES.id FROM ' . $wpdb->prefix . 'bwg_image AS T_IMAGES LEFT JOIN ( SELECT  MAX(item_longest_dimension) AS item_longest_dimension, pricelist_id FROM ' . $wpdb->prefix . 'wdpg_ecommerce_pricelist_items AS T_PRICELIST_ITEMS LEFT JOIN ' . $wpdb->prefix . 'wdpg_ecommerce_pricelists AS T_PRICELISTS ON T_PRICELIST_ITEMS.pricelist_id = T_PRICELISTS.id  WHERE  T_PRICELISTS.sections LIKE "%downloads%" GROUP BY pricelist_id) AS T_PRICELISTS ON T_IMAGES.pricelist_id = T_PRICELISTS.pricelist_id WHERE T_IMAGES.gallery_id=%d',$gallery_id));
      foreach ( $rows as $row ) {
        if ( $row->item_longest_dimension ) {
          $file_path = str_replace("thumb", ".original", htmlspecialchars_decode(BWG()->upload_dir . $row->thumb_url, ENT_COMPAT | ENT_QUOTES));
          WDWLibrary::repair_image_original($file_path);
          list($img_width) = @getimagesize(htmlspecialchars_decode($file_path, ENT_COMPAT | ENT_QUOTES));
          if ( $row->item_longest_dimension > $img_width ) {
            $not_set_items[] = $row->id;
          }
        }
      }
    }
    if ( empty($not_set_items) == FALSE ) {
      echo "<input type='hidden' id='not_set_items' value='" . implode(",", $not_set_items) . "'>";
    }

    return $not_set_items;
  }

  private function get_facebook_embed() {
    if ( has_filter('init_display_facebook_gallery_embed_bwg') ) {
      $data = apply_filters('init_display_facebook_gallery_embed_bwg', array(),  array() );
      return $data;
    }
  }

  public function ordering( $id = 0 ) {
    $jsonData = array();
    $message_id = $this->model->ordering( WDWLibrary::get('orders', array()) );
    $jsonData['message'] = WDWLibrary::message_id($message_id);
    echo json_encode($jsonData);
    exit;
  }
}