<?php
// Silence may be golden, but sometimes words paint the canvas of understanding.

namespace Plugli\Linksy\SearchAndReplace\Admin\Partials\SearchAndReplace\Helpers;

use Linksy\SearchAndReplace\Plugli\Standard\Helpers\Database\Database;
use Plugli\Linksy\SearchAndReplace\Helpers\Post\Post;
use Linksy\SearchAndReplace\Plugli\Standard\Helpers\Str;

class UrlReplace extends Helpers
{
    public function get($search_mode, $filter_query, $options = [])
    {
        $posts = Database::table("posts")->select(['ID', 'post_title', 'post_name', 'post_type', 'post_status'])
            ->whereNotIn('post_status', ['inherit']);

        if ($search_mode === 'EXACT') {
            $posts = $posts->where('post_name', $this->search);
        } elseif ($search_mode === 'CONTAINS') {
            $posts = $posts->whereLike('post_name', $this->search);
        }

        $posts = $posts->get();
        $data = [];

        foreach ($posts as $post) {
            $key = $post->ID;

            $new_post = new Post($post->ID);

            $data[$key] = [
                'source' => $post->post_title,
                'post_id' => $post->ID,
                'link' => $post->post_name,
                'post_type' => $post->post_type,
                'post_status' => $post->post_status,
                'view_link' => $new_post->get_link(),
                'edit_link' => $new_post->get_edit_link(),
            ];
        }

        if (!empty($this->filters['search_mode'])) {
            return $this->filter($data);
        }

        return $data;
    }

    public function filter($data = [], $query = '')
    {
        if (empty($this->filters) || !isset($this->filters['search_mode']) || !is_array($this->filters['search_mode'])) {
            return $data;
        }

        $filtered_data = [];

        foreach ($data as $item) {
            $match = true;
            foreach ($this->filters['search_mode'] as $mode) {
                $query = null;
                $this->filter_mode = $mode;

                if ($mode === 'title' && isset($this->filters['title'])) {
                    $query = $this->filters['title'];
                } elseif (($mode === 'link' || $mode === 'link-is') && isset($this->filters['link'])) {
                    $query = $this->filters['link'];
                }

                if ($query !== null) {
                    if (!$this->filterByMode($item, $query)) {
                        $match = false;
                        break;
                    }
                }
            }

            if ($match) {
                $filtered_data[] = $item;
            }
        }

        return $filtered_data;
    }

    protected function filterByMode($item, $query)
    {
        if (empty($query)) {
            return true;
        }

        if ($this->filter_mode === 'link-is') {
            return isset($item['link']) && strtolower($item['link']) === strtolower($query);
        }

        $key = $this->filter_mode === 'title' ? 'source' : 'link';

        if (isset($item[$key])) {
            return Str::contains(strtolower($item[$key]), strtolower($query));
        }

        return false;
    }
}
