<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Arr;

use App\Models\Inquiry;
use App\Models\Page;
use App\Models\Livestream;
use App\Utilities\Paginate;
use App\Utilities\PageResponse;
use App\Utilities\SearchResult;

use App\Http\Requests\InquiryValidation;
use App\Traits\SoftDeletesControllerTrait;

class InquiriesController extends Controller
{
    use SoftDeletesControllerTrait;

    protected function getModel()
    {
        return new Inquiry();
    }

    public function index()
    {
        if (!auth()->user()?->can('viewAny', Inquiry::class)) {
            if (request()->expectsJson()) {
                return response()->json(['error' => 'You do not have permission load inquiries'], 403);
            } else {
                return redirect('/')->with('error', 'You do not have access to view Inquiries');
            }
        }

        return view('inquiries.index');
    }

    public function paginate()
    {
        if (!auth()->check()) {
            return response()->json(['error' => 'You do not have permission to load inquiries'], 401);
        }

        if (!auth()->user()?->can('viewAny', Inquiry::class)) {
            return response()->json(['error' => 'You do not have permission to load inquiries'], 403);
        }

        $inquiries = Inquiry::with('location', 'user', 'user.livestreams', 'tags');

        if (! request('show_archived')) {
            $inquiries->whereNull('archived_at');
        }

        if (request('deleted') && auth()->user()->hasRole('admin')) {
            $inquiries->withTrashed();
        }

        $inquiries->orderBy(request('sort_by', 'updated_at'), request('descending') ? 'desc' : 'asc');

        if (request('terms')) {
            $terms = SearchResult::collectTerms();

            if (count($terms) > 0) {
                $first = true;
                foreach ($terms as $term) {
                    $inquiries->where(function ($query) use ($term, $first) {
                        if ($first) {
                            $query->where('question', 'LIKE', '%'.$term.'%');
                            $first = false;
                        } else {
                            $query->orWhere('question', 'LIKE', '%'.$term.'%');
                        }
                    })
                    ->orWhere('phone', 'LIKE', '%'.$term.'%')
                    ->orWhere('target_year', 'LIKE', '%'.$term.'%')
                    //->orWhere('target_grade', 'LIKE', '%'.$term.'%')
                    ->orWhereHas('user', function($query) use ($term) {
                        $query->where('name', 'LIKE', '%'.$term.'%')
                            ->orWhere('email', 'LIKE', '%'.$term.'%');
                    });
                }
            }
        }

        return $inquiries->paginate(request('paginate_count', 10), $columns = ['*'], $pageName = 'paginate_page');
    }

    public function store(InquiryValidation $request, $id = null)
    {
        $inquiry = (new Inquiry())->saveInquiry(requestInput(), $id);

        return response()->json([
            'success' => 'Inquiry Saved',
            'redirect' => $inquiry->url,
        ]);
    }

    public function view($id)
    {
        if (! request()->hasValidSignature()) {
            abort(401);
        }

        $inquiry = Inquiry::findOrFail($id);

        //$inquiry->load('livestreams');

        $page = Inquiry::findPage();

        $content_elements = $page->published_content_elements
                                 ->filter(function ($content_element) use ($inquiry) {
                                     if (!$content_element->tags->count()) {
                                         return true;
                                     }
                                     return $inquiry->tags->intersect($content_element->tags)->count();
                                 })->values();

        $page->load('version');
        $page->appendAttributes();
        $page->content_override = $content_elements;

        return view('inquiries.view', compact('page', 'inquiry'));
    }

    public function tags()
    {
        return response()->json([
            'tags' => Inquiry::getTags(),
        ]);
    }

    public function archive($id) 
    {
        if (!auth()->check()) {
            return response()->json(['error' => 'You do not have permission to archive inquiries'], 401);
        }

        $inquiry = Inquiry::findOrFail($id);

        if (!auth()->user()?->can('update', $inquiry)) {
            return response()->json(['error' => 'You do not have permission to archive inquiries'], 403);
        }

        if ($inquiry->archived_at) {
            $inquiry->archived_at = null;
            $success = 'Restored';
        } else {
            $inquiry->archived_at = now();
            $success = 'Archived';
        }

        $inquiry->save();

        return response()->json([
            'success' => 'Inquiry '.$success,
        ]);
    }
}
