<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Http\Requests\Api\BaseShow;
use App\Http\Requests\Api\MemberIndex;
use App\Http\Resources\MemberListResource;
use App\Http\Resources\MemberResource;
use App\Models\Member;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Resources\Json\JsonResource;

class MemberController extends Controller
{
    /**
     * Display the specified resource.
     *
     * @param MemberIndex $request
     * @return JsonResource|JsonResponse
     */
    public function index(MemberIndex $request)
    {
        $data = $request->validated();

        $query = Member::full()
            ->select('members.*', 'member_languages.*')
            ->where('status', 'published');

        if (!empty($data['memberType'])) {
            $query->where('member_type_id', $data['memberType']);
        }

        if (!empty($data['country'])) {
            $query->where('country_id', $data['country']);
        }

        if (!empty($data['letter'])) {
            $query = $query->where(function ($query) use ($data) {
                $query->where('title', 'LIKE', $data['letter'] . '%')
                        ->orWhere('title', 'LIKE', strtoupper($data['letter']) . '%');
            });
        }

        switch ($data['orderBy']) {
            case 'alphabetical':
                $query->orderBy('member_languages.title', 'asc');
                break;
            default:
                # latest
                $query->orderBy('members.created_at', 'desc');
                break;
        }

        $perPage = $data['perPage'] ?? 12;
        $page = $data['page'] ?? 1;

        $query->with([
            'memberType' => function($query) {
                $query->full();
            },
            'country' => function($query) {
                $query->full();
            },
            'logo',
        ]);

        $members = $query->paginate($perPage, ['*'], 'page', $page);

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

        if ($members) {
            return [
                'data' => MemberListResource::collection($members),
                'pagination' => $paginationData,
            ];
        }
        return response()->json([], 404);
    }

    /**
     * Display the specified resource.
     *
     * @param BaseShow $request
     * @return JsonResource|JsonResponse
     */
    public function show(BaseShow $request)
    {
        $data = $request->validated();

        $query = Member::full()
            ->select('members.*', 'member_languages.*')
            ->where('status', 'published')
            ->where('lang_slug', $data['slug']);

        $query->with([
            'memberType' => function($query) {
                $query->full();
            },
            'country' => function($query) {
                $query->full();
            },
            'logo',
        ]);

        $member = $query->first();

        if ($member) {
            return new MemberResource($member);
        }

        return response()->json([], 404);
    }
}
