<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Http\Requests\Api\ClauseIndex;
use App\Http\Requests\Api\ClauseShow;
use App\Http\Resources\ClauseResource;
use App\Models\Clause;

class ClauseController extends Controller
{
    /**
     * Display a listing of clauses.
     *
     * @param  \App\Http\Requests\Api\ClauseIndex  $request
     * @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection
     */
    public function index(ClauseIndex $request)
    {
        $data = $request->validated();
        $query = Clause::full();

        if (!empty($data['search'])) {
            $search = $data['search'];

            $query->where(function ($q) use ($search) {
                $q->where('clause', 'like', "%{$search}%");

                $q->orWhere(function ($subQuery) use ($search) {
                    $subQuery->where('title', 'like', "%{$search}%")
                        ->orWhere('clause_wording', 'like', "%{$search}%");
                });
            });
        }

        $perPage = $data['perPage'] ?? 10;
        $clauses = $query->paginate($perPage);

        $paginationData = [
            'currentPage' =>  intval($clauses->currentPage()),
            'lastPage' => intval($clauses->lastPage()),
            'perPage' =>  intval($clauses->perPage()),
            'total' =>  intval($clauses->total()),
            'count' =>  intval($clauses->count()),
            'hasMorePages' => $clauses->hasMorePages(),
            'nextPageUrl' => $clauses->nextPageUrl(),
            'prevPageUrl' => $clauses->previousPageUrl(),
        ];

        return [
            'data' => ClauseResource::collection($clauses),
            'pagination' => $paginationData,
        ];
    }

    /**
     * Display the specified clause.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \App\Http\Resources\ClauseResource
     */
    public function show(ClauseShow $request)
    {
        $data = $request->validated();
        $clauseId = $data['id'];
        $clause = Clause::find($clauseId);
        return $clause ? new ClauseResource($clause) : response()->json([], 404);
    }
}
