<?php
namespace App\Scopes;
use App\Encryptable;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Scope;
class MessageScope implements Scope
{

    private $enctryable;

    public function __construct($enctryable)
    {
        $this->enctryable = $enctryable;
    }

    public function apply(Builder $builder, Model $model)
    {
        $i = 0;
        foreach ($builder->getQuery()->wheres as $key => $value) {
            $j = 0;
            if (!isset($value['column']) && $value['type'] == 'Nested') {
                foreach ($builder->getQuery()->wheres[$i]['query']->wheres as $_key => $_value) {
                    if (isset($_value['column']) && in_array($_value['column'], $this->enctryable)) {
                        if (isset($builder->getQuery()->wheres[$i]['query']->bindings['where'][$j]) && $builder->getQuery()->wheres[$i]['query']->bindings['where'][$j] == $_value['value']) {


                            $binding_value = "";
                            if (wall_decrypt($builder->getQuery()->bindings['where'][$j], true) == false) {
                                if (strpos($builder->getQuery()->bindings['where'][$j], '%') !== false) {
                                    $binding_value = str_replace('%', '', $builder->getQuery()->bindings['where'][$j]);
                                    $binding_value = '%' . wall_encrypt($binding_value) . '%';
                                } else {
                                    $binding_value = wall_encrypt($builder->getQuery()->bindings['where'][$j]);
                                }
                                $builder->getQuery()->bindings['where'][$j] = $binding_value;
                            }
                            $binding_value2 = "";
                            if (wall_decrypt($builder->getQuery()->wheres[$i]['query']->wheres[$j]['value'], true) == false) {
                                if (strpos($builder->getQuery()->wheres[$i]['query']->wheres[$j]['value'], '%') !== false) {
                                    $binding_value2 = str_replace('%', '', $builder->getQuery()->wheres[$i]['query']->wheres[$j]['value']);
                                    $binding_value2 = '%' . wall_encrypt($binding_value2) . '%';
                                } else {
                                    $binding_value2 = wall_encrypt($builder->getQuery()->wheres[$i]['query']->wheres[$j]['value']);
                                }
                                $builder->getQuery()->wheres[$i]['query']->wheres[$j]['value'] = $binding_value2;
                            }
                            if (wall_decrypt($builder->getQuery()->wheres[$i]['query']->bindings['where'][$j], true) == false) {
                                if (strpos($_value['value'], '%') !== false) {
                                    $_value['value'] = str_replace('%', '', $_value['value']);
                                    $_value['value'] = '%' . wall_encrypt($_value['value']) . '%';
                                } else {
                                    $_value['value'] = wall_encrypt($_value['value']);
                                }
                                $builder->getQuery()->wheres[$i]['query']->bindings['where'][$j] = $_value['value'];
                            }
                        }
                    }
                    $j++;
                }
            } else if (isset($value['column']) && isset($value['value']) && in_array($value['column'], $this->enctryable) && !wall_decrypt($value['value'], true)) {
                if ($builder->getQuery()->bindings['where'][$i] == $value['value']) {

                    if (strpos($value['value'], '%') !== false) {
                        $value['value'] = str_replace('%', '', $value['value']);
                        $value['value'] = '%' . wall_encrypt($value['value']) . '%';
                    } else {
                        $value['value'] = wall_encrypt($value['value']);
                    }

                    $builder->getQuery()->wheres[$i]['value'] = $value['value'];
                    $builder->getQuery()->bindings['where'][$i] = $value['value'];
                }
            }
            $i++;
        }
    }
}
