<?php

class CRM_ConstituentsOnly_BAO_Query extends CRM_Contact_BAO_Query_Interface {

  static $_networkFields = array();

  public function &getFields() {
    return self::$_networkFields;
  }

  /**
   * @param $query
   *
   */
  public function select(&$query) {
    // hack for profile search
    $url = CRM_Utils_Array::value('q', $_GET);
    if (in_array($url, ['civicrm/profile', 'civicrm/contact/search/builder'])) {
      if (empty($query->_params)) {
        $query->_params[] = [
          'entryURL',
          '=',
          0,
          0,
          1,
        ];
      }
      $query->_paramLookup['entryURL'] = [
        'entryURL',
        '=',
        0,
        0,
        1,
      ];
    }
  }

  /**
   * @param $query
   *
   */
  public function where(&$query) {
    if (empty($query->_paramLookup['entryURL'])) {
      return;
    }

    $url = CRM_Utils_Array::value('q', $_GET);
    if (strpos($url, 'civicrm/contact/') === FALSE) {
      return;
    }

    if (!empty($query->_paramLookup['ignore_constituent_search'])) {
      $query->_qill[0][] = ts("Include non-constituents in this search");
      return;
    }

    if (CRM_Utils_Array::value('civicrm_contact', $query->_tables) && empty($query->_paramLookup['do_not_trade'])) {
      $query->_where[0][] = "
        contact_a.id NOT IN (SELECT id FROM (
          SELECT contact_a.id
            FROM civicrm_contact contact_a
              LEFT JOIN civicrm_relationship cr
                ON (cr.contact_id_a = contact_a.id)
                AND cr.is_active = 1
              LEFT JOIN civicrm_contact cc1
                ON (cr.contact_id_a = cc1.id)
            WHERE contact_a.do_not_trade = 1 AND (cr.id IS NULL OR cc1.is_deleted = 1 OR cc1.do_not_trade = 1)
            AND contact_a.id <> cc1.id
          UNION
          SELECT contact_a.id
            FROM civicrm_contact contact_a
              LEFT JOIN civicrm_relationship cr
                ON (cr.contact_id_b = contact_a.id)
                AND cr.is_active = 1
              LEFT JOIN civicrm_contact cc1
                ON (cr.contact_id_b = cc1.id)
            WHERE contact_a.do_not_trade = 1 AND (cr.id IS NULL OR cc1.is_deleted = 1 OR cc1.do_not_trade = 1)
            AND contact_a.id <> cc1.id
          ) AS temp GROUP BY id
        )
      ";
    }
  }

  /**
   * @param string $name
   * @param $mode
   * @param $side
   *
   */
  public function from($name, $mode, $side) {
  }

  /**
   * @param $tables
   *
   */
  public function setTableDependency(&$tables) {
  }

  public function getPanesMapper(&$panes) {
  }

  /**
   * @param $panes
   *
   */
  public function registerAdvancedSearchPane(&$panes) {
  }

  /**
   * @param CRM_Core_Form $form
   * @param $type
   *
   */
  public function buildAdvancedSearchPaneForm(&$form, $type) {
  }

  /**
   * @param $paneTemplatePathArray
   * @param $type
   *
   */
  public function setAdvancedSearchPaneTemplatePath(&$paneTemplatePathArray, $type) {
  }

}