<?php

namespace App\Http\Controllers\Api;

use App\Developer;
use App\Http\Controllers\Controller;
use App\Http\Requests\Api\SearchRequest;
use App\Http\Resources\DeveloperCollection;
use App\Http\Resources\ResidentialComplex\ResidentialComplexSearchCollection;
use App\Http\Resources\ResidentialComplexCollection;
use App\Repository\DeveloperRepository;
use App\Repository\ResidentialComplexRepository;
use App\ResidentialComplex;
use Illuminate\Http\JsonResponse;

class SearchController extends Controller
{
    /**
     * @var DeveloperRepository
     */
    public $developerRepository;

    /**
     * @var ResidentialComplexRepository
     */
    public $residentialComplexesRepository;

    public function __construct(
        DeveloperRepository $developerRepository,
        ResidentialComplexRepository $residentialComplexRepository
    ) {
        $this->developerRepository = $developerRepository;
        $this->residentialComplexesRepository = $residentialComplexRepository;
    }

    public function search(SearchRequest $request)
    {
        $query = $request->input('query');
        $residentialComplexes = ResidentialComplex::search($query)
            ->where('enabled', 1)
            ->take(5)->get();
        $developer = Developer::search($query)
            ->where('enabled', 1)
            ->take(1)->first();
        if ($developer) {
            $developerStatistic = (new DeveloperRepository())->find(['developer_id' => $developer->id]);
        }

        return new JsonResponse([
            'data' => [
                "residential_complex" => new ResidentialComplexSearchCollection($residentialComplexes),
                "developer" => isset($developerStatistic) ?
                    new DeveloperCollection($developerStatistic, ['statistic' => true]) : []
            ]
        ]);
    }

    public function searchAll(SearchRequest $request)
    {
        $query = $request->input('query');
        $pageRC = $request->input('page_rc');
        $pageDeveloper = $request->input('page_developer');

        $residentialComplexes = ResidentialComplex::search($query)
            ->where('enabled', 1)
            ->paginate(3, "", $pageRC);
        $developer = Developer::search($query)
            ->where('enabled', 1)
            ->paginate(2, "page", $pageDeveloper);

        $residentialComplexesIds = $residentialComplexes->map(function ($item, $key) {
            return $item->id;
        });

        $developerIds = $developer->map(function ($item, $key) {
            return $item->id;
        });

        $residentialComplexStatistic = $this->residentialComplexesRepository->listResidentialComplex([
            'residential_complex_ids' => $residentialComplexesIds,
        ]);

        $developerStatistic = $this->developerRepository->find([
            'developer_ids' => $developerIds,
        ]);

        return new JsonResponse([
            'data' => [
                "residential_complex" => new ResidentialComplexCollection($residentialComplexStatistic, [
                    'show_first_image' => true,
                    'collection' => true
                ]),
                "developer" => new DeveloperCollection($developerStatistic, [
                    'statistic' => true,
                    'residential_complex' => true
                ]),
                "count" => [
                    'residential_complex' => $residentialComplexes->total(),
                    'developer' => $developer->total(),
                ]
            ]
        ]);
    }
}
