<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Http\Requests\Api\ResidentialComplexesRequest;
use App\Http\Requests\Api\ResidentialComplexRequest;
use App\Http\Resources\ResidentialComplex as ResidentialComplexResource;
use App\Http\Resources\ResidentialComplexCollection;
use App\Http\Resources\ResidentialComplexLocationCollection;
use App\Repository\PriceRepository;
use App\Repository\ResidentialComplexRepository;
use App\ResidentialComplex;
use App\Services\ResidentialComplexService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class ResidentialComplexesController extends Controller
{
    const CACHE_KEY_FILTER_OPTIONS = 'residential_complex_filter_options';

    /** @var ResidentialComplexService */
    public $residentialComplexService;

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

    public function __construct(
        ResidentialComplexRepository $residentialComplexRepository,
        ResidentialComplexService $residentialComplexService
    ) {
        $this->residentialComplexRepository = $residentialComplexRepository;
        $this->residentialComplexService = $residentialComplexService;
    }

    public function filter(ResidentialComplexesRequest $request)
    {
        $parameters = $request->query();
        $parameters = $this->residentialComplexService->reorganizeFilterParameters($parameters);

        $residentialComplexes = $this->residentialComplexRepository->listResidentialComplex($parameters, false);
        $countResidentialComplexesParameters = $parameters;
        if (isset($countResidentialComplexesParameters['page'])) {
            unset($countResidentialComplexesParameters['page']);
            $countResidentialComplexesParameters['count_of_rc'] = true;
//            $countResidentialComplexes = $this->residentialComplexRepository
//                ->listResidentialComplex($countResidentialComplexesParameters, false);
        }

        if (isset($parameters['count_of_rc'])) {
            return ['count' => $residentialComplexes->count()];
        } else {
            return [
                'data' => new ResidentialComplexCollection($residentialComplexes, [
                    'show_first_image' => true,
                    'collection' => true
                ]),
//                'count' => isset($residentialComplexes) ? $residentialComplexes->count() : 287
            ];
        }
    }

    public function getFilterParameters(Request $request)
    {
        $data = $this->residentialComplexService->filterParameters();

        return [
            'data' => $data
        ];
    }

    public function show(ResidentialComplexRequest $request, $slug)
    {
        $parameters = [
            'show_residential_complex' => true,
            'residential_complex_slug' => $slug
        ];

        $residentialComplex = $this->residentialComplexRepository->listResidentialComplex($parameters);

        return ['data' => new ResidentialComplexResource($residentialComplex->first(), $parameters)];
    }

    public function allCoordinates()
    {
        $residentialComplexes =
            ResidentialComplex::query()
                ->leftJoin('prices as p', 'residential_complexes.id', '=', 'p.residential_complex_id')
                ->whereNull('p.section_id')
                ->select([
                    'residential_complexes.*',
                    DB::raw("min(p.price_per_squera_meter) as min_price_per_square_meter"),
                    ])
                ->where('enabled', 1)
                ->groupBy('residential_complexes.id')
                ->get();

        return ['data' => new ResidentialComplexLocationCollection($residentialComplexes)];
    }
}
