<?php
// Exit if accessed directly
if( !defined( 'ABSPATH' ) ) exit;

if(!class_exists('vxcf_hubspot_api')){
    
class vxcf_hubspot_api extends vxcf_hubspot{
  
  public $info=array(); // info
  public $error= "";
  public $timeout=30;
  public $url='https://api.hubapi.com/';
  
  function __construct($info) { 
      if(isset($info['data']) && is_array($info['data'])){
  $this->info= $info['data'];
  if(!isset($this->info['portal_id'])){
      $this->info['portal_id']='';
  }
  if(!empty($info['meta']['portal_id'])){
  // $this->info['portal_id']=$info['meta']['portal_id'];   
  }
      }
if(!empty(self::$api_timeout)){
$this->timeout=self::$api_timeout;
}

}
public function get_token(){
$info=$this->info;
//$users=$this->get_users();
$ac=$this->get_account();
 if(!empty($ac['portalId'])){
      $info['portal_id']=$ac['portalId'];
      $info['time_zone']=$ac['timeZone'];
      $info['currency']=$ac['currency'];
      $info['valid_token'] ='true';
  }else{
     unset($info['access_token']); 
       if(is_string($ac)){
   $info['error']=$ac;  
   
    }  
  }

$info['_time']=time(); 
return $info;
}

  public function refresh_token($info=""){
  if(!is_array($info)){
  $info=$this->info;
  }
  if(!isset($info['refresh_token']) || empty($info['refresh_token'])){
   return $info;   
  }
  $client=$this->client_info(); 
  ////////it is oauth    
  $body=array("client_id"=>$client['client_id'],"client_secret"=>$client['client_secret'],"redirect_uri"=>$client['call_back'],"grant_type"=>"refresh_token","refresh_token"=>$info['refresh_token']);
  $res=$this->post_hubspot('api','',$this->url.'oauth/v1/token',"post",$body);

  $re=json_decode($res,true); 
  if(isset($re['access_token']) && $re['access_token'] !=""){ 
  $info["access_token"]=$re['access_token'];
 // $info["org_id"]=$re['id'];
  $info["class"]='updated';
  $token=$info;
  }else{
  $info['error']=$re['error_description'];
  $info['access_token']="";
   $info["class"]='error';
  $token=array(array('errorCode'=>'406','message'=>$re['error_description']));

  unset($info['valid_token']); 
  }
  $info["token_time"]=time(); //api validity check
  //update hubspot info 
  //got new token , so update it in db
  $this->update_info( array("data"=> $info),$info['id']); 
  return $info; 
  }
  public function handle_code(){
      $info=$this->info;
      $id=$info['id'];
 
        $client=$this->client_info();
  $log_str=$res=""; $token=array();
  if(isset($_REQUEST['code'])){
  $code=$this->post('code'); 
  
  if(!empty($code)){
  $body=array("client_id"=>$client['client_id'],"client_secret"=>$client['client_secret'],"redirect_uri"=>$client['call_back'],"grant_type"=>"authorization_code","code"=>$code);
  $res=$this->post_hubspot('api','',$this->url.'oauth/v1/token',"post",$body);

  $log_str="Getting access token from code";
   $token=json_decode($res,true); 
   if(!isset($token['access_token'])){
      $log_str.=" =".$res; 
   }
  }
  if(isset($_REQUEST['error'])){
   $token['error_description']=$this->post('error_description');   
  }
  }else{  
  //revoke token on user request
  if(isset($info['instance_url']) && $info['instance_url']!="")
  $res=$this->post_hubspot('api','',$this->url.'/oauth/v1/refresh-tokens/'.$info['refresh_token'],'delete');  
  $log_str="Access token Revoked on Request";
  }

  $info['portal_id']='';
//var_dump($token); die();
  $info['instance_url']=$this->post('instance_url',$token);
  $info['access_token']=$this->post('access_token',$token);
  $info['client_id']=$client['client_id'];
  $info['_id']=$this->post('id',$token);
  $info['refresh_token']=$this->post('refresh_token',$token);
 // $info['issued_at']=round($this->post('issued_at',$token)/1000);
  $info['signature']=$this->post('signature',$token);
  $info['token_time']=time();
  $info['_time']=time();
  $info['error']=$this->post('message',$token);
  $info['api']="api";
  $info["class"]='error';
  $info['valid_token'] ='';
  if(!empty($info['access_token'])){
  $info["class"]='updated';
  $info['valid_token'] ='true';
  $this->info=$info;
  $ac=$this->get_account();
  if(!empty($ac['portalId'])){
      $info['portal_id']=$ac['portalId'];
      $info['time_zone']=$ac['timeZone'];
      $info['currency']=$ac['currency'];
  }
  $this->info=$info;
  }
 
 // $info=$this->validate_api($info);
  $this->update_info( array('data'=> $info) , $id);
  return $info;
  }
public function get_account(){
    $url='integrations/v1/me';
return $this->post_hubspot_arr($url);
}  
  /**
  * Posts data to hubspot, Get New access token on expiration message from hubspot
  * @param  string $path hubspot path 
  * @param  string $method CURL method 
  * @param  array $body (optional) if you want to post data
  * @return array HubSpot Response array
  */
  public  function post_hubspot_arr($path,$method='get',$body=""){
  $info=$this->info;  
  $get_token=false; 
  $api=$this->post('api',$info);
  $dev_key='';
  
  if($api == 'web'){
    $dev_key=$this->post('api_key',$info);  
  }else{
    
   $token_time=(int)$this->post('token_time',$info);
   $time=time();
   $expiry=$token_time+1797;   //21600 
   if($expiry<$time){
   $info=$this->refresh_token(); 
    
   }
      if(!empty($info['access_token'])){
  $dev_key=$info['access_token'];      
    }   
  }
  if(strpos($path,'https://') === false){
  $path=$this->url.$path;
  }
 
  $hubspot_res=$this->post_hubspot($api,$dev_key,$path,$method,$body); //var_dump($info); die();
  //var_dump($hubspot_res,$path); die();
  $hubspot_response=json_decode($hubspot_res,true); 
  if($api != 'web' && isset($hubspot_response['status']) && $hubspot_response['status'] == 'error' && isset($hubspot_response['category']) && $hubspot_response['category'] == 'EXPIRED_AUTHENTICATION'){
    $info=$this->refresh_token();  
     if(!empty($info['access_token'])){
  $dev_key=$info['access_token'];      
    }
    $hubspot_res=$this->post_hubspot($api,$dev_key,$path,$method,$body); 
  $hubspot_response=json_decode($hubspot_res,true);    
  }///var_dump($hubspot_response); die();
  if(!is_array($hubspot_response)){
      $hubspot_response=wp_strip_all_tags($hubspot_response);
  }
  if(isset($hubspot_response['status']) && $hubspot_response['status'] == 'error' && !empty($hubspot_response['message']) && strpos($hubspot_response['message'],'expired') !== false){ 
  $get_token=true;         
  }


  return $hubspot_response;   
  }
  /**
  * Posts data to hubspot
  * @param  string $dev_key Slesforce Access Token 
  * @param  string $path HubSpot Path 
  * @param  string $method CURL method 
  * @param  string $body (optional) if you want to post data 
  * @return string HubSpot Response JSON
  */
  public function post_hubspot($type,$dev_key,$path,$method,$body=""){

  $header=array(); $pars=array();
  if(is_array($body) && isset($body['grant_type'])){ //getting access token
  $header=array('content-type'=>'application/x-www-form-urlencoded');  
  $body=http_build_query($body); 
  }else{
    if($type == 'web'){
        $pars['hapikey']=$dev_key;  
    }else{  
  $header['Authorization']=' Bearer ' . $dev_key;     
    }

      if($method != "get"){
          if(is_array($body)){
          $body=json_encode($body); }
  $header['content-length']= strlen($body);
  $header['content-type']='application/json';
  }else{
      
    if(is_array($body) && count($body)>0){
    $pars=array_merge($pars,$body);    
    } 
  }
      if(count($pars)>0){
          $mark=strpos($path,'?') === false ? '?' : '&';
  $path.=$mark.http_build_query($pars);      
    }  
    }

$args=array(
  'method' => strtoupper($method),
  'timeout' => $this->timeout,
  'headers' => $header,
//  'body' => $body
  );
if(!empty($body)){
    $args['body']= $body;
}
  $response = wp_remote_post( $path, $args);   //var_dump($response,$path);
 
  if(is_wp_error($response)){
      $error=$response->get_error_message();
   $body=json_encode(array('error'=>$error));   
  }else if(isset($response['body'])){
   $body=$response['body'];    
  }
  $code=wp_remote_retrieve_response_code($response);
    if($code == 204){ $body='{"code":"204","msg":"No Content"}'; }
  if($code == 404){ $body='{"code":"404","msg":"Not Found"}'; }
  if(empty($body) && isset($response['response']) && is_array($response['response'])){
   $body=json_encode($response['response']);   
  }

 
  return $body; 
  }
  /**
  * Get HubSpot Client Information
  * @param  array $info (optional) HubSpot Client Information Saved in Database
  * @return array HubSpot Client Information
  */
  public function client_info(){
      $info=$this->info;
  $client_id='66c8b02a-06d8-47f1-b7c9-a0e0b1b28384';
  $client_secret='3f9b1144-21e4-47a1-bb57-4f25be001727';
  $call_back="https://www.crmperks.com/sf_auth/";
  //custom app
  if(is_array($info)){
      if($this->post('custom_app',$info) == "yes" && $this->post('app_id',$info) !="" && $this->post('app_secret',$info) !="" && $this->post('app_url',$info) !=""){
     $client_id=$this->post('app_id',$info);     
     $client_secret=$this->post('app_secret',$info);     
     $call_back=$this->post('app_url',$info);     
      }
  }
  return array("client_id"=>$client_id,"client_secret"=>$client_secret,"call_back"=>$call_back);
  }
  public function get_forms(){
 $url='forms/v2/forms';

return $this->post_hubspot_arr($url,'get');   
   
  } 
public function get_form_fields($object){
        
}  
  /**
  * Get fields from hubspot
  * @param  string $form_id Form Id
  * @param  array $form (optional) Form Settings 
  * @param  array $request (optional) custom array or $_REQUEST 
  * @return array HubSpot fields
  */
  public function get_crm_fields($object){ 

      $h_fields='["company_size","date_of_birth","degree","field_of_study","gender","graduation_date","hs_content_membership_notes","hs_content_membership_status","hs_facebook_ad_clicked","hs_facebookid","hs_google_click_id","hs_googleplusid","hs_lead_status","hs_legal_basis","hs_linkedinid","hs_twitterid","job_function","marital_status","military_status","relationship_status","school","seniority","start_date","work_email","firstname","twitterhandle","followercount","lastname","salutation","twitterprofilephoto","email","hs_persona","fax","address","hubspot_owner_id","city","linkedinbio","twitterbio","state","hs_analytics_source","zip","country","linkedinconnections","hs_language","kloutscoregeneral","jobtitle","photo","message","closedate","lifecyclestage","company","website","numemployees","annualrevenue","industry","associatedcompanyid"]'; 
      //,"mobilephone","phone","fax"
$free_fields=json_decode($h_fields,true);
if(strpos($object,'vxf_') !== false){
         $form_id=substr($object,4);
         $fields=array();
       $url='forms/v2/forms/'.$form_id;
$res=$this->post_hubspot_arr($url,'get');  

if(!empty($res['formFieldGroups'])){
    $form_fields=array();
    foreach($res['formFieldGroups'] as $group){
            if(!empty($group['fields'])){
        foreach($group['fields'] as $v){
      $form_fields[]=$v;
      if(!empty($v['dependentFieldFilters'])){ 
        foreach($v['dependentFieldFilters'] as $vv){
            if(!empty($vv['dependentFormField'])){
          $form_fields[]=$vv['dependentFormField'];      
            }
        }
    }
        }}
    }
    foreach($form_fields as $v){ 
        $field_arr=array('name'=>$v['name'],'label'=>$v['label'],'type'=>$v['fieldType']);
        $field_arr['req']= $v['required'] === true ? 'true' : '';
          if(!empty($v['options'])){
         $ops=$eg=array();
      foreach($v['options'] as $op){
      $ops[]=array('label'=>$op['label'],'value'=>$op['value']);
      $eg[]=$op['value'].'='.$op['label'];
      }
      if(!empty($ops)){
   $field_arr['options']=$ops;  
  $field_arr['eg']=implode(', ', array_slice($eg,0,20));
      }   
  }
  $field_arr['object']=$v['propertyObjectType'];
  if(!in_array($v['name'],$free_fields)){
      $field_arr['is_custom']='true';
  }

  $fields[$v['name']]=$field_arr;    
    
    }
 $fields['vx_consent']=array('name'=>'vx_consent','label'=>'GDPR Consent','type'=>'boolean');   

  $res_def=$this->post_hubspot_arr('email/public/v1/subscriptions','get');   
if(!empty($res_def['subscriptionDefinitions'])){
   foreach($res_def['subscriptionDefinitions'] as $v){
   $fields['vxoptin_'.$v['id']]=array('name'=>'vxoptin_'.$v['id'],'label'=>$v['name'],'type'=>'text');      
   } 
} 

 $fields['vx_url']=array('name'=>'vx_url','label'=>'Page URL','type'=>'URL');   
 $fields['vx_title']=array('name'=>'vx_title','label'=>'Page Title','type'=>'text');   
 $fields['vx_camp_id']=array('name'=>'vx_camp_id','label'=>'SFDC Campaign ID','type'=>'text');   
 $fields['vx_webinar_key']=array('name'=>'vx_webinar_key','label'=>'GoToWebinar key','type'=>'text');   
 $fields['vx_ip']=array('name'=>'vx_ip','label'=>'IP Address','type'=>'text');   
 $fields['skipValidation']=array('name'=>'skipValidation','label'=>'Skip Validation','type'=>'boolean','eg'=>'0 or 1','options'=>array(array('label'=>'True','value'=>'1'),array('label'=>'False','value'=>'0')));   
}else{
    $fields=json_encode($res);
}

//var_dump($fields,$free_fields);
return $fields;     
}
      
  if($object == 'Task'){
    return array('name'=>array('name'=>'name','label'=>'Title','type'=>'Text'),'description'=>array('name'=>'description','label'=>'Note','type'=>'Text','req'=>'true'),'timestamp'=>array('name'=>'timestamp', 'label'=>'Due Date','type'=>'Datetime'));  
  }
        $module='contacts'; $v='v1';  
      if($object == 'Company'){
          $module='companies'; 
      }else if($object == 'Ticket'){
          $module='tickets'; $v='v2';
      }else if($object == 'Deal'){
         $module='deals'; 
      }
      $path='properties/'.$v.'/'.$module.'/properties';
    //  $module='tickets';
$hubspot_response=$this->post_hubspot_arr($path);  
//var_dump($hubspot_response);
  $field_info='No Fields Found';
  if( !empty($hubspot_response['message'])){
   $field_info=$hubspot_response['message'];   
  }else if(isset($hubspot_response[0]) && is_array($hubspot_response[0])){
  $field_info=array();
  foreach($hubspot_response as $k=>$field){

  if(isset($field['readOnlyValue']) && $field['readOnlyValue'] === false ){
  $required=""; 
  if(in_array($field['name'],array('email','name','dealname'))){
  $required="true";   
  } 
  if($object == 'Ticket' && in_array($field['name'],array('subject','content'))){
   $required="true";   
  }
  $type=$field['fieldType'];
  if(isset($field['type']) && in_array($field['fieldType'],array('datetime'))  ){ // 
    $type=$field['type'];  
  }
  $field_arr=array('name'=>$field['name'],"type"=>$type);
  $field_arr['label']=$field['label']; 
  $field_arr['req']=$required;
  if(!empty($field['options'])){
      $ops=$eg=array();
      foreach($field['options'] as $op){
      $ops[]=array('label'=>$op['label'],'value'=>$op['value']);
      $eg[]=$op['value'].'='.$op['label'];
      }
      if(!empty($ops)){
   $field_arr['options']=$ops;  
  $field_arr['eg']=implode(', ', array_slice($eg,0,20));
      }  
  }
  if(! (isset($field['hubspotDefined']) && $field['hubspotDefined'] == true) ){
   $field_arr['is_custom']='true';   
  }
  $field_info[$field['name']]=$field_arr;  
  }    
  }
  if(in_array($module,array('contacts','companies'))){
   $field_info['id']=array('name'=>'id','type'=>'number','label'=>'ID (Do not map this field)','is_custom'=>'true','req'=>'');    
  }
  return $field_info;
  }else{
   return json_encode($hubspot_response);   
  }

  }
    
  /**
  * Get campaigns from hubspot
  * @return array HubSpot campaigns
  */
  public function get_lists(){ 
    $hubspot_response=$this->post_hubspot_arr('contacts/v1/lists/static?count=500');
 // var_dump($hubspot_response);
  ///seprating fields
  $field_info=__('No List Found','gravity-forms-hubspot-crm');
  if(isset($hubspot_response['lists']) && is_array($hubspot_response['lists'])){
  $field_info=array();
  foreach($hubspot_response['lists'] as $k=>$field){
      if($field['dynamic'] === false){
  $field_info[$field['listId']]=$field['name'];
     }     
  }
  }
    if(isset($hubspot_response['message'])){
   $field_info=$hubspot_response['message'];   
  }
  return $field_info;
}
public function get_pipes($object='tickets'){ 
$hubspot_response=$this->post_hubspot_arr('crm-pipelines/v1/pipelines/'.$object);

  ///seprating fields
  $field_info=__('No List Found','gravity-forms-hubspot-crm');
  if(isset($hubspot_response['results']) && is_array($hubspot_response['results'])){
  $field_info=array();
  foreach($hubspot_response['results'] as $k=>$field){
      if(!empty($field['stages']) && $field['active'] === true){
if(!empty($field['stages'])){
foreach($field['stages'] as $stage){
  if(isset($stage['stageId'])){
  $field_info[$field['pipelineId'].'-v_xx-'.$stage['stageId']]=$field['label'].' - '.$stage['label'];
      }   
}
}  }
  }
  }
    if(isset($hubspot_response['message'])){
   $field_info=$hubspot_response['message'];   
  }
  return $field_info;
}


  public function get_flows(){ 
  $hubspot_response=$this->post_hubspot_arr('automation/v3/workflows');  
 // var_dump($hubspot_response); die();
  ///seprating fields
  $field_info=__('No Work Flow Found','gravity-forms-hubspot-crm');
  if(isset($hubspot_response['workflows']) && is_array($hubspot_response['workflows'])){
  $field_info=array();
  foreach($hubspot_response['workflows'] as $k=>$field){
      if($field['enabled'] === true){
  $field_info[$field['id']]=$field['name'];}     
  }
  }
    if(isset($hubspot_response['message'])){
   $field_info=$hubspot_response['message'];   
  }
  return $field_info;
}
  /**
  * Get users from hubspot
  * @return array HubSpot users
  */
  public function get_users(){ 

  $hubspot_response=$this->post_hubspot_arr('owners/v2/owners');

  ///seprating fields
  $field_info=__('No Users Found');
    if(isset($hubspot_response['status']) && $hubspot_response['status'] == 'error' && !empty($hubspot_response['message'])){
   $field_info=$hubspot_response['message'];   
  } else if( isset($hubspot_response) && is_array($hubspot_response)){
  $field_info=array();
  foreach($hubspot_response as $k=>$field){
  $field_info[$field['ownerId']]=$field['firstName'].' '.$field['lastName'].' ( '.$field['email'].' )';     
  }
  }

  return $field_info;
}

  
  /**
  * Posts object to hubspot, Creates/Updates Object or add to object feed
  * @param  array $entry_id Needed to update hubspot response
  * @return array HubSpot Response and Object URL
  */
public function push_object($object,$fields,$meta){ 

   $ass=array("fromObjectId"=>'551',"toObjectId"=>'3528102',"category"=> "HUBSPOT_DEFINED","definitionId"=>15);
   $assoc=array("fromObjectId"=>'150264022',"toObjectId"=>'801665692',"category"=> "HUBSPOT_DEFINED","definitionId"=>20);
   
   $ass=array(array('name'=>'dealname','value'=>'First Deal from API'),array('name'=>'amount','value'=>600)); //150264019
   $post=array('properties'=>$ass);
 $product_post=array(array('name'=>'name','value'=>'Firstxx Product from API'),array('name'=>'price','value'=>270),array('name'=>'description','value'=>'<b>product description is here</b>'));
  
   $item_post=array(array('name'=>'name','value'=>'First Product from API'),array('name'=>'price','value'=>200),array('name'=>'quantity','value'=>20),array('name'=>'hs_product_id','value'=>'28874673'));
  
    $deal=array(array('externalPropertyName'=>'name','hubspotPropertyName'=>'dealname','dataType'=>'STRING'),array('externalPropertyName'=>'price','hubspotPropertyName'=>'amount','dataType'=>'STRING'),array('externalPropertyName'=>'dealstage','hubspotPropertyName'=>'dealstage','dataType'=>'STRING'));
     
   $product=array(array('externalPropertyName'=>'name','hubspotPropertyName'=>'name','dataType'=>'STRING'),array('externalPropertyName'=>'price','hubspotPropertyName'=>'price','dataType'=>'STRING'),array('externalPropertyName'=>'description','hubspotPropertyName'=>'description','dataType'=>'STRING'));
   $json='[
        {
          "externalPropertyName": "tax",
          "hubspotPropertyName": "tax",
          "dataType": "NUMBER"
        },
        {
          "externalPropertyName": "qty",
          "hubspotPropertyName": "quantity",
          "dataType": "NUMBER"
        },
        {
          "externalPropertyName": "price",
          "hubspotPropertyName": "price",
          "dataType": "NUMBER"
        },
        {
          "externalPropertyName": "discount",
          "hubspotPropertyName": "discount",
          "dataType": "NUMBER"
        }
      ]';
    $item=json_decode($json,1);  
     $json='[
        {
          "externalPropertyName": "firstname",
          "hubspotPropertyName": "firstname",
          "dataType": "STRING"
        },
        {
          "externalPropertyName": "familyname",
          "hubspotPropertyName": "lastname",
          "dataType": "STRING"
        },
        {
          "externalPropertyName": "customer_email",
          "hubspotPropertyName": "email",
          "dataType": "STRING"
        },
        {
          "externalPropertyName": "phone_number",
          "hubspotPropertyName": "mobilephone",
          "dataType": "STRING"
        }
      ]';
    $con=json_decode($json,1);
 $post=array('enabled'=>true,'mappings'=>array('DEAL'=>array('properties'=>$deal),'CONTACT'=>array('properties'=>$con),'PRODUCT'=>array('properties'=>$product),'LINE_ITEM'=>array('properties'=>$item)));   
 
 $ass='{
  "id": "vx-store",
  "label": "VX Store",
  "adminUri": "http://localhost/wp12"
}';
 

 $ass='{
  "storeId": "vx-store",
  "objectType": "PRODUCT",
  "messages": [
    {
      "action": "UPSERT",
      "changedAt": "1553486400000",
      "externalObjectId": "123",
      "properties": {
        "name": "Jeff aaaxx",
        "price": "562",
        "description": "Jeff aaaxx description is here"
      },
      "associations": {
        "DEAL": [
          "123"
        ]
      }
    }
  ]
}';

  $ass='{
  "storeId": "vx-store",
  "objectType": "DEAL",
  "messages": [
    {
      "action": "UPSERT",
      "changedAt": "1553486400000",
      "externalObjectId": "1234",
      "properties": {
        "name": "Jeff aaaxx",
        "price": "562"
      }
    }
  ]
}';
 

   $ass=json_encode(array($assoc));
   $ass=json_encode($product_post);
   $path='deals/v1/deal';
   
   $path='crm-objects/v1/objects/products/paged?properties=name&name=xxxx';
 $path='crm-objects/v1/objects/line_items';
 $path='extensions/ecomm/v2/settings?appId=39761&hapikey=5837d3ab-02a3-45c3-b533-15dca0039428'; 
// $path='extensions/ecomm/v2/stores'; 
 $path='extensions/ecomm/v2/sync/messages'; 
 $path='crm-objects/v1/objects/line_items'; 
// $path='crm-associations/v1/associations';
 $path='crm-associations/v1/associations/create-batch';
 $path='crm-objects/v1/objects/products';
 //?appId=5961456&hapikey=fc99920a-94d4-4de6-aad3-8d580e60c3ba //&hapikey=fc99920a-94d4-4de6-aad3-8d580e60c3ba  ,  5837d3ab-02a3-45c3-b533-15dca0039428
 // info37 appId=39761&hapikey=5837d3ab-02a3-45c3-b533-15dca0039428
  //$res=$this->post_hubspot_arr($path,'get');
//   $res=$this->post_hubspot_arr($path,'post',$ass);
//   var_dump($res); die();    
   $extra=$contact=array();
  $portal_id=$id=""; $error=""; $action=""; $link=""; $search=$search_response=$status=""; 
  // entry note
  $entry_exists=false;
    $debug = isset($_REQUEST['vx_debug']) && current_user_can('manage_options'); 
    $event=$this->post('event',$meta);

    if(isset($fields['id'])){
      $id=$fields['id']['value']; unset($meta['primary_key']); unset($fields['id']);
  }
  if($debug){ ob_start();}
  //check primary key
  if(isset($meta['primary_key']) && $meta['primary_key']!="" && isset($fields[$meta['primary_key']]['value']) && $fields[$meta['primary_key']]['value']!=""){    
  $search=$fields[$meta['primary_key']]['value'];
  $field=$meta['primary_key'];
    if($object == 'Contact' && $field == 'email'){
 $spath='contacts/v1/contact/email/'.$search.'/profile';
$search_response=$this->post_hubspot_arr($spath);
if(!empty($search_response['vid'])){
 $id=$search_response['vid'];   
$contact =$search_response['properties'];   
}

}else if(in_array($object, array('Ticket','Deal','Company'))){
  $sobject='';
  if($object == 'Deal'){ $sobject='deals'; }else if($object == 'Ticket'){ $sobject='tickets'; }else if($object == 'Company'){ $sobject='companies'; }
 $spath='crm/v3/objects/'.$sobject.'/search';
 $sbody=array('filterGroups'=>array(array('filters'=>array(array('propertyName'=>$field,"operator"=> "EQ",'value'=>$search)))));
 $search_response=$hubspot_response=$this->post_hubspot_arr($spath,'post',$sbody); 
 if(!empty($search_response['results'][0]['id'])){
   $search_response=$search_response['results'][0];
   $id=$search_response['id']; 
 }
 //var_dump($search_response); die();
 }else{

  $sbody=array();
  $spath='contacts/v1/search/query';
  if($object == 'Company'){
  $spath='companies/v2/companies/'.$field.'/'.str_replace(array('http://','https://'),'',$search);    
  }else{
  $sbody['q']=$search;    
  }
  //search object
  //if primary key option is not empty and primary key field value is not empty , then check search object
  $search_response=$hubspot_response=$this->post_hubspot_arr($spath,'get',$sbody); 
 // var_dump($search_response,$spath,$sbody); die();

        if($search !=""){
      if(is_array($search_response) && count($search_response)>10){
       $search_response=array_slice($search_response,count($search_response)-10,10);   
      }
  }
  if(isset($hubspot_response[0]['Id'])&& $hubspot_response[0]['Id']!=""){
  //object found, update old object or add to feed
  $id=$hubspot_response[count($hubspot_response)-1]['Id'];
      $entry_exists=true;
  }
  if(!empty($hubspot_response['message'])){
  $error=$hubspot_response['message'];
  }else{
       if($object == 'Company' && isset($hubspot_response[0]['companyId']) ){
           $id=$hubspot_response[0]['companyId'];
           $portal_id=$hubspot_response[0]['portalId'];
       }else  if($object == 'Contact' && isset($hubspot_response['contacts'][0]['vid'])){
      $id=$hubspot_response['contacts'][0]['vid'];     
      $portal_id=$hubspot_response['contacts'][0]['portal-id'];     
       }
  }
    }
     $extra["body"]=$search;
      $extra["response"]=$search_response;   
  if($debug){
  ?>
  <pre>
  <h3>Search field</h3>
  <p><?php print_r($field) ?></p>
  <h3>Search term</h3>
  <p><?php print_r($search) ?></p>
  <h3>Search response</h3>
  <p><?php print_r($hubspot_response) ?></p>
  </pre>    
  <?php
  }

  $hubspot_response='';
  }

  if(!empty($meta['crm_id'])){
   $id=$meta['crm_id'];   
  } 

  $note_object='';
     if(in_array($event,array('delete_note','add_note'))){    
  if(isset($meta['related_object'])){
      $note_object=$meta['related_object'];
    $extra['Note Object']= $meta['related_object'];
  }
  if(isset($meta['note_object_link'])){
    $extra['note_object_link']=$meta['note_object_link'];
  }
}

if(!empty($meta['add_pipe']) && !empty($meta['pipe']) ){
      $sep=strpos($meta['pipe'],'-v_xx-') !== false ? '-v_xx-' : '-';
    $exp=explode($sep,$meta['pipe']);
    $fields['hs_pipeline']=array('value'=>$exp[0],'label'=>'Pipeline');
    if(!isset($fields['hs_pipeline_stage'])){
    $fields['hs_pipeline_stage']=array('value'=>$exp[1],'label'=>'Pipeline Stage');
    }
}
if(!empty($meta['add_sales_pipe']) && !empty($meta['sales_pipe']) ){
    $sep=strpos($meta['sales_pipe'],'-v_xx-') !== false ? '-v_xx-' : '-';
    $exp=explode($sep,$meta['sales_pipe']);
    $fields['pipeline']=array('value'=>$exp[0],'label'=>'Pipeline');
    if(!isset($fields['dealstage'])){
    $fields['dealstage']=array('value'=>$exp[1],'label'=>'Deal Stage');
    }
}
 if(!empty($meta['OwnerId']['value'])){
$fields['hubspot_owner_id']=array('value'=>$meta['OwnerId']['value'],'label'=>'Owner');  
 }
//var_dump($fields); 
  $path=''; $send_body=false; $post=array(); //$meta['_vx_contact_id']=array('value' =>301);
  //if($error ==""){
  if($id == ""){
  $action="Added";
 $send_body=true;
  if($object == 'Contact'){
   $path='contacts/v1/contact';   
  }else if($object == 'Ticket'){
   $path='crm-objects/v1/objects/tickets';   
  }else if($object == 'Deal'){
   $path='deals/v1/deal';   
 
  }else if($object == 'Company'){
   $path='companies/v2/companies';   
  }else if($object == 'Task'){ 
   $send_body=false;
   $path='engagements/v1/engagements';
if(!empty($fields['description']['value'])){        
      // && (!empty($meta['_vx_contact_id']) || !empty($meta['_vx_company_id']))
   $post['engagement']=array('type'=>'TASK');   
   
   if(!empty($fields['timestamp']['value'])){
       $t=strtotime($fields['timestamp']['value']);
       if(!empty($t)){
       $offset=get_option('gmt_offset') * 3600;
        $t-=$offset;
        $t=$t.'000';
       }
   $post['engagement']['timestamp']=$t;
   }
   
   $post['metadata']=array('body'=>$fields['description']['value']);
   
   if(!empty($fields['name']['value'])){
   $post['metadata']['subject']=$fields['name']['value'];    
   }
 if(!empty($meta['_vx_contact_id']['value'])){
 $post['associations']['contactIds']=array($meta['_vx_contact_id']['value']);    
 }
 if(!empty($meta['_vx_company_id']['value'])){
 $post['associations']['companyIds']=array($meta['_vx_company_id']['value']);    
 }
 if(!empty($meta['OwnerId']['value'])){
 $post['associations']['ownerIds']=array($meta['OwnerId']['value']);    
 $post['engagement']['ownerId']=$meta['OwnerId']['value'];    
 }  
   }
//var_dump($post,$fields); die();   
  }     
  $method='post';
$status="1";

  }
  else{ 

  if($event == 'add_note'){
   
  $path='engagements/v1/engagements';
  $post['engagement']=array('type'=>'NOTE');
  $post['associations']=array();
  if($note_object == 'Company'){
    $post['associations']['companyIds']=array((int)$id);  
  }else   if($note_object == 'Contact'){
  $post['associations']['contactIds']=array((int)$id);      
  }else   if($note_object == 'Ticket'){
  $post['associations']['ticketIds']=array((int)$id);      
  }
  $post['metadata']=array('body'=>$fields['Body']['value']);         
  $status="1";
  $method='post';  
  }
  else if(in_array($event,array('delete','delete_note'))){
     $method='delete';
     if($event == 'delete'){
         if($object == 'Contact'){
        $path='/contacts/v1/contact/vid/'.$id;     
         }else if($object == 'Company'){
         $path='companies/v2/companies/'.$id;    
         }else if($object == 'Ticket'){
         $path='/crm-objects/v1/objects/tickets/'.$id;    
         }    
     }else{
   $path='engagements/v1/engagements/'.$id;
     }  
  $action="Deleted";

    $status="5";  
  }
  else{    
      
  $action="Updated";
  if($object == 'Contact'){
   $path='contacts/v1/contact/vid/'.$id.'/profile';  
   $method='post'; 
  }else if($object == 'Company'){
   $path='companies/v2/companies/'.$id;   
  $method='put';
  }else if($object == 'Deal'){
   $path='deals/v1/deal/'.$id;   
  $method='put';
  } 
  $status="2"; $send_body=true;
   if(!empty($meta['update'])){ $path=''; }
  }

  }

$is_form=false;
if($send_body){ 
if(strpos($object,'vxf_') !== false){
$is_form=true;
 //,'sfdcCampaignId'=>'','goToWebinarWebinarKey'=>''
/*$post=array(
'context'=>array('pageUri'=>'https://local','pageName'=>'Local Test','hutk'=>'25886241a10e48ad86842f0125b578f7','ipAddress'=>'120.23.56.58'),
'legalConsentOptions'=>array('consent'=>array(
'consentToProcess'=>true,"text"=>'I agree to allow Example Company to store and process my personal data.',
//'communications'=>array(array('value'=>true,'text'=>'Text','subscriptionTypeId'=>'5388809'))
))
);*/

$form_id=substr($object,4);

if(!empty($this->info['portal_id']) && !empty($form_id) && !empty($fields) ){
$path='https://api.hsforms.com/submissions/v3/integration/submit/'.$this->info['portal_id'].'/'.$form_id;
if(!isset($fields['vx_url']) && !empty($meta['_vx_entry']['_vx_url'])){
    $fields['vx_url']=array('value'=>$meta['_vx_entry']['_vx_url'] , 'label'=>'Page URL');
}
if(!isset($fields['vx_title'])){
    $title='';
    if( !empty($meta['_vx_entry']['_vx_title'])){ $title=$meta['_vx_entry']['_vx_title']; }
    else if( !empty($meta['_vx_entry']['_vx_form_name'])){ $title=$meta['_vx_entry']['_vx_form_name']; }
    if(!empty($title)){
    $fields['vx_title']=array('value'=>$title , 'label'=>'Form Name');
    }
}
if(!isset($fields['vx_ip']) && !empty($meta['_vx_entry']['_vx_ip']) && filter_var($meta['_vx_entry']['_vx_ip'], FILTER_VALIDATE_IP)){
    $fields['vx_ip']=array('value'=>$meta['_vx_entry']['_vx_ip'] , 'label'=>'IP Address');
}


$context=array('vx_url'=>'pageUri','vx_title'=>'pageName','vx_ip'=>'ipAddress','vx_camp_id'=>'sfdcCampaignId','vx_webinar_key'=>'goToWebinarWebinarKey');
$com_consent=array();
foreach($fields as $k=>$v){
if(isset($context[$k])){
if($k == 'vx_url' && !empty($v['value'])){
    $v['value'] = strtok($v['value'], '?');
}
$post['context'][$context[$k]]=$v['value'];     
}else if($k == 'skipValidation'){
   $post['skipValidation']=empty($v['value']) ? false : true;    
}else if($k == 'vx_consent'){
$post['legalConsentOptions']=array('consent'=>array(
'consentToProcess'=>!empty($v['value']),
"text"=>'Yes, you can store and process my personal data.',
//"communications"=>array(array('value'=>true,'subscriptionTypeId'=>10577111,'text'=>'Yes, subscribe me'))
)); 
  
}else if(strpos($k,'vxoptin_') === 0){
    $val=!empty($v['value']) ? true : false;
 $com_consent[]=array('value'=>$val,'text'=>$v['value'],'subscriptionTypeId'=>substr($k,8));   
}else{
$type = !empty($meta['fields'][$k]['type']) ? $meta['fields'][$k]['type'] : '';    
$obj_type = !empty($meta['fields'][$k]['object']) ? $meta['fields'][$k]['object'].'.' : '';  
if( !in_array($obj_type,array('TICKET.')) ){ $obj_type=''; }    
$v['value']=$this->verify_val($v['value'],$type);
$post['fields'][]=array('name'=>$obj_type.$k,'value'=>$v['value']);
} }

if(!empty($meta['_vx_entry']['_vx_htuk'])){
    $post['context']['hutk']=$meta['_vx_entry']['_vx_htuk'];
$fields['hutk']=array('value'=>$meta['_vx_entry']['_vx_htuk'] , 'label'=>'Cookie');
}

if(!empty($com_consent) && isset($post['legalConsentOptions'])){
   $post['legalConsentOptions']['consent']['communications']= $com_consent;
}
//var_dump($post,$fields,$meta['_vx_entry']); die();
}
     
}
else{
$key='property';
if( in_array($object,array('Company','Ticket','Deal') ) ){
$key='name';
}

if(is_array($fields)){
foreach($fields as $k=>$v){
$type = !empty($meta['fields'][$k]['type']) ? $meta['fields'][$k]['type'] : '';  
  
$v['value']=$this->verify_val($v['value'],$type);
if($type == 'checkbox' && !empty($meta['fields'][$k]['is_custom']) && !empty($contact[$k]['value'])){
  $v['value']=$contact[$k]['value'].';'.$v['value']; 
  $v['value']=array_unique(explode(';',$v['value']));
  $v['value']=implode(';',$v['value']); 
}
$post[]=array($key=>$k,'value'=>$v['value']);    
} //var_dump($post); die();
}
if($object != 'Ticket'){
$post=array('properties'=>$post);
}
} }
$hubspot_response=array();
if(!empty($path)){
    if($object == 'Deal'){
            if(!empty($meta['_vx_contact_id']['value'])){
 $post['associations']['associatedVids']=array($meta['_vx_contact_id']['value']); 
 $fields['vid']= array('value'=>$meta['_vx_contact_id']['value'],'label'=>'Contact ID');  
 }
 if(!empty($meta['_vx_company_id']['value'])){
 $post['associations']['associatedCompanyIds']=array($meta['_vx_company_id']['value']);  
  $fields['vid-company']= array('value'=>$meta['_vx_company_id']['value'],'label'=>'Company ID');   
 }
    }
    
$post_data=json_encode($post);
//var_dump($path,$post,$object,$id); die('--------');
$hubspot_response=$this->post_hubspot_arr($path,$method,$post_data);
//var_dump($hubspot_response,$post,$fields); die();
if($object == 'Deal'){
//var_dump($post,$hubspot_response); die();
}
}
if(!$is_form){
    $id_key='id';
    if($object == 'Deal'){
        $id_key='dealId';
    }

  if(isset($hubspot_response[$id_key])){
  $id=$hubspot_response[$id_key];

if(!empty($meta['order_items']) && $status == '1'){
  $items=$this->get_wc_items($meta);
  $assoc_items=array();
  foreach($items as $item){
      if(!empty($item['p_id'])){
   $hub_id=get_post_meta($item['p_id'],'vxc_hubspot_id',true);
   if(empty($hub_id)){
    $product_post=array(array('name'=>'name','value'=>$item['title']),array('name'=>'price','value'=>$item['unit_price']),array('name'=>'description','value'=>esc_html($item['desc'])));  
  $path='crm-objects/v1/objects/products';
 $product_res=$this->post_hubspot_arr($path,'post',json_encode($product_post));
 $extra['create product']=$product_res;    
  if(!empty($product_res['objectId'])){
      $hub_id=$product_res['objectId'];
  }
   }
 //create line item
     $item_post=array(array('name'=>'name','value'=>$item['title']),array('name'=>'price','value'=>$item['unit_price']),array('name'=>'quantity','value'=>$item['qty']),array('name'=>'hs_product_id','value'=>$hub_id));  
   $path='crm-objects/v1/objects/line_items'; 
    $product_res=$this->post_hubspot_arr($path,'post',json_encode($item_post)); 
    $extra['item post']=$item_post;      
    $extra['create item']=$product_res;      
  if(!empty($product_res['objectId'])){
      $item_id=$product_res['objectId'];
    $assoc_items[]=array("fromObjectId"=>$item_id,"toObjectId"=>$id,"category"=> "HUBSPOT_DEFINED","definitionId"=>20); 
  }   
      }    
  }
  if(!empty($assoc_items)){
  $path='crm-associations/v1/associations/create-batch'; 
  $product_res=$this->post_hubspot_arr($path,'put',json_encode($assoc_items)); 
  $extra['assign items to deal']=$product_res;   
  }  
}
 // $status="1";
  }else if(isset($hubspot_response['objectId'])){
  $id=$hubspot_response['objectId'];
  $portal_id=$hubspot_response['portalId'];
   $link='https://app.hubspot.com/contacts/'.$portal_id.'/ticket/'.$id.'/'; 
  $status="1";
  }

}else{
 $status="1";   
}
  //
  if(isset($hubspot_response['message'])){
  $error=$hubspot_response['message'];
  if(!empty($hubspot_response['errors'][0]['message'])){
        $error=$hubspot_response['errors'][0]['message'];
    }
  $id=''; $status='';
  }else{
      $portal_id=$this->info['portal_id'];
      if(isset($hubspot_response['vid']) && isset($hubspot_response['portal-id'])){
        $id=$hubspot_response['vid'];
        $portal_id=$hubspot_response['portal-id'];
        
      }else if(isset($hubspot_response['companyId']) && isset($hubspot_response['portalId'])){
       $id=$hubspot_response['companyId'];
        $portal_id=$hubspot_response['portalId'];
      }
      if(isset($hubspot_response['engagement']['id'])){
       $id=$hubspot_response['engagement']['id'];   
      }
      if(!empty($id) && !empty($portal_id)){
   if($object == 'Company'){
     $link='https://app.hubspot.com/sales/'.$portal_id.'/company/'.$id.'/';     
   }else if($object == 'Deal'){
     $link='https://app.hubspot.com/sales/'.$portal_id.'/deal/'.$id.'/';     
   }else if($object == 'Contact'){   
   $link='https://app.hubspot.com/contacts/'.$portal_id.'/contact/'.$id.'/';  
   
   //add to list and work flow
   if(!empty($fields['email']['value']) && !empty($meta['add_flow']) && !empty($meta['flow'])){
       $email=$fields['email']['value'];
    $path='automation/v2/workflows/'.$meta['flow'].'/enrollments/contacts/'.$email ;
   $work_res=$this->post_hubspot_arr($path,'post');
   $extra['Enrol to Work Flow']=$meta['flow'];   
   $extra['Work Flow Response']=$work_res;   
   }
   //add to static list
      if( !empty($meta['add_list']) && !empty($meta['list'])){
          $path='contacts/v1/lists/'.$meta['list'].'/add' ;
   $list_res=$this->post_hubspot_arr($path,'post',array('vids'=>array($id)));
   $extra['Add to List']=$meta['list']; 
   $extra['List Rsponse']=$list_res; 
       
      }
   
   //assign company
   if(!empty($meta['_vx_company_id']['value'])){
       $path='companies/v2/companies/'.$meta['_vx_company_id']['value'].'/contacts/'.$id;
        $comp_res=$this->post_hubspot_arr($path,'put');
   $extra['Assign Company']=$meta['_vx_company_id']['value']; 
   $extra['Company Rsponse']=$comp_res;   
   }
   
   }
   else if($object == 'Ticket'){ 
    if(!empty($meta['_vx_contact_id']['value'])){
       $path='crm-associations/v1/associations';
       $ass=array("fromObjectId"=>$meta['_vx_contact_id']['value'],"toObjectId"=>$id,"category"=> "HUBSPOT_DEFINED","definitionId"=>15);
        $comp_res=$this->post_hubspot_arr($path,'put',$ass);
   $extra['Assign Contact']=$meta['_vx_contact_id']['value'];  
   }
      if(!empty($meta['_vx_company_id']['value'])){
          $ass=array("fromObjectId"=>$meta['_vx_company_id']['value'],"toObjectId"=>$id,"category"=> "HUBSPOT_DEFINED","definitionId"=>25);
   $path='crm-associations/v1/associations';
        $comp_res=$this->post_hubspot_arr($path,'put',$ass);
   $extra['Assign Company']=$meta['_vx_company_id']['value']; 
   }
        
   }
   //
      }
      //
  }

 

  if($debug){
  ?>
  <pre>
  <h3>HubSpot Information</h3>
  <p><?php print_r($this->info) ?></p>
  <h3>Data Sent</h3>
  <p><?php echo json_encode($fields) ?></p>
  <h3>HubSpot response</h3>
  <p><?php print_r($hubspot_response) ?></p>
  <h3>Object</h3>
  <p><?php print_r($object."--------".$action) ?></p>
  </pre>    
  <?php
  $contents=trim(ob_get_clean());
  if($contents!=""){
  update_option($this->id."_debug",$contents);   
  }
  }
   //add entry note
 if(!empty($meta['__vx_entry_note']) && !empty($id)){
 $disable_note=$this->post('disable_entry_note',$meta);
   if(!($entry_exists && !empty($disable_note))){
       $entry_note=$meta['__vx_entry_note'];
       
          $path='engagements/v1/engagements';
  $note_post['engagement']=array('type'=>'NOTE');
  $note_post['associations']=array();
  if($object == 'Company'){
    $note_post['associations']['companyIds']=array((int)$id);  
  }else   if($object == 'Contact'){
  $note_post['associations']['contactIds']=array((int)$id);      
  }else   if($object == 'Ticket'){
  $note_post['associations']['ticketIds']=array((int)$id);      
  }else   if($object == 'Deal'){
  $note_post['associations']['dealIds']=array((int)$id);      
  }
  $note_post['metadata']=array('body'=>$entry_note['Body'],'subject'=>$entry_note['Title']); 
  
$note_res=$this->post_hubspot_arr($path,"POST",$note_post); 
  $extra['Note Response']=$note_res;
  $extra['Note Title']=$entry_note['Title'];
  $extra['Note Body']=$entry_note['Body'];

  
   }  
 }

  return array("error"=>$error,"id"=>$id,"link"=>$link,"action"=>$action,"status"=>$status,"data"=>$fields,"response"=>$hubspot_response,"extra"=>$extra);
}
public function verify_val($val,$type){
   // $type=isset($field['type']) ? $field['type'] : '';
            if( $type == 'file'  && is_string($val)){
            $files_temp=json_decode($val,true);
            if(!empty($files_temp)){
             $val=$files_temp;   
            }
    
        }
        if(is_array($val)){
        $val=implode(';',$val);     
        }
        if($type == 'number'){
        $val=filter_var( $val, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION ); 
        }
        if($type == 'booleancheckbox'){
            $val=!empty($val) ? 'true' : 'false';
        }
        if($type == 'date'){
            try{
        $date = new DateTime( $val );
        $date->modify( 'midnight' );
     $val=$date->getTimestamp() * 1000;
            }catch(Exception $e){
                
            }
        }
      if(in_array($type,array('datetime'))){
      $val=strtotime($val).'000';      
      }
return html_entity_decode($val);      
}
public function get_wc_items($meta){
      $_order=self::$_order;
    //  $fees=$_order->get_shipping_total();
    //  $fees=$_order-> get_total_discount();
    //  $fees=$_order-> get_total_tax();

     $items=$_order->get_items(); 
     $products=array();  $order_items=array(); 
if(is_array($items) && count($items)>0 ){
foreach($items as $item_id=>$item){

$sku=$desc=''; $qty=$unit_price=$tax=$total=$p_id=0;
if(method_exists($item,'get_product')){
  // $p_id=$v->get_product_id();  
   $product=$item->get_product();
   if(!$product){ continue; } //product deleted but exists in line items of old order

   $total=(int)$item->get_total();
   $qty = $item->get_quantity();
   $tax = $item->get_total_tax();

   $desc=$product->get_short_description();
   $title=$product->get_title();
   $sku=$product->get_sku();     
   $unit_price=$product->get_price(); 
   $p_id=$product->get_parent_id();
   if(empty($p_id)){
   $p_id=$product->get_id();
   }
   if(empty($total)){ $unit_price=0; } 
   
      if(method_exists($_order,'get_item_total')){
      // $cost=(float)$_order->get_item_total($item,false,true); //including woo coupon discuont
       $unit_price=(float)$_order->get_item_subtotal($item, false, true); // does not include coupon discounts
   
     if(!empty($meta['item_price_custom'])){
    //  $cost=(float)wc_get_order_item_meta($item->get_id(),$meta['item_price_custom'],true); 
     }   
      // $cost=round($cost,2);
       $unit_price=round($unit_price,2);
    }
          
   }else{ //version_compare( WC_VERSION, '3.0.0', '<' )  , is_array($item) both work
          $line_item=$this->wc_get_data_from_item($item); 
   $p_id= !empty($line_item['variation_id']) ? $line_item['variation_id'] : $line_item['product_id'];
        $line_desc=array();
        if(!isset($products[$p_id])){
        $product=new WC_Product($p_id);
        }else{
         $product=$products[$p_id];   
        }
       if(!$product){ continue; }  
        $qty=$line_item['qty'];
        $products[$p_id]=$product;
        $sku=$product->get_sku(); 
        if(empty($sku) && !empty($line_item['product_id'])){ 
            //if variable product is empty , get simple product sku
            $product_simple=new WC_Product($line_item['product_id']);
            $sku=$product_simple->get_sku(); 
        }
        $unit_price=$product->get_price();
        $title=$product->get_title();
        $desc=$product->get_short_description();
        $p_id=$line_item['product_id'];
          }
  $temp=array('sku'=>$sku,'unit_price'=>$unit_price,'title'=>$title,'qty'=>$qty,'tax'=>$tax,'total'=>$total,'desc'=>$desc,'p_id'=>$p_id);
          if(method_exists($product,'get_stock_quantity')){
   $temp['stock']=$product->get_stock_quantity();
} 
     $order_items[]=$temp;     
      }
} 
     
   return $order_items;       
}

public function get_entry($object,$id){
        $path='contacts/v1/contact/vid/'.$id.'/profile';
        if($object == 'Company'){
        $path='/companies/v2/companies/'.$id;    
        }else if($object == 'Task'){
        $path='/engagements/v1/engagements/'.$id;    
        }
  $arr=$this->post_hubspot_arr($path);
  $entry=array();  // var_dump(isset($arr['metadata']));
  if(isset($arr['metadata'])){
     $arr['properties']=$arr['metadata']; 
  }
  if(isset($arr['properties']) && is_array($arr['properties']) && count($arr['properties'])>0){
      foreach($arr['properties'] as $k=>$v){
          
          if(isset($v['value']) && !is_array($v['value'])){
           $entry[$k]=$v['value']; 
          }else if(!is_array($v)){
          $entry[$k]=$v;    
          }
 
      }
  }
 // var_dump($arr,$path,$entry); die();
  return $entry;     
  }
public function create_fields_section($fields){
$arr=array(); 
if(!isset($fields['object'])){
    $objects=array(''=>'Select Object','Contact'=>'Contact','Company'=>'Company');
    if(is_array($objects_sf)){
    $objects=array_merge($objects,$objects_sf);
    }
 $arr['gen_sel']['object']=array('label'=>__('Select Object','gravity-forms-hubspot-crm'),'options'=>$objects,'is_ajax'=>true,'req'=>true);   
}else if(isset($fields['fields']) && !empty($fields['object'])){
    // filter fields
    $crm_fields=$this->get_crm_fields($fields['object']); 
    if(!is_array($crm_fields)){
        $crm_fields=array();
    }
    $add_fields=array();
    if(is_array($fields['fields']) && count($fields['fields'])>0){
        foreach($fields['fields'] as $k=>$v){
           $found=false;
                foreach($crm_fields as $crm_key=>$val){
                    if(strpos($crm_key,$k)!== false){
                        $found=true; break;
                }
            }
         //   echo $found.'---------'.$k.'============'.$crm_key.'<hr>';
         if(!$found){
       $add_fields[$k]=$v;      
         }   
        }
    }
 $arr['fields']=$add_fields;   
}

return $arr;  
} 
public function create_field($field){
  //  return 'ok';
 
$name=isset($field['name']) ? $field['name'] : '';
$label=isset($field['label']) ? $field['label'] : '';
$type=isset($field['type']) ? $field['type'] : '';
$object=isset($field['object']) ? $field['object'] : '';

$error='Unknow error';
if(!empty($label) && !empty($type) && !empty($object)){

    $body=array('name'=>$name,'label'=>$label,'groupName'=> strtolower($object).'information','type'=>'string');
    $path='properties/v1/contacts/properties';
    if($object == 'Company'){ 
    $path='properties/v1/companies/properties';
    }
$arr=$this->post_hubspot_arr($path,'POST',$body); 

    $error='ok';
if(!isset($arr['name']) ){
  $error=$arr;  
 if(isset($arr['message'])){
 $error=$arr['message'];    
 }   
}
}
return $error;    
}    
}
}
?>