<?php

namespace App\Http\Controllers\Api;

use App\Developer;
use App\District;
use App\Helpers\CacheTimeHelper;
use App\Http\Controllers\Controller;
use App\Http\Resources\DeveloperCollection;
use App\Http\Resources\DistrictCollection;
use App\Http\Resources\ResidentialComplexCollection;
use App\Marker;
use App\Repository\DeveloperRepository;
use App\Repository\DistrictRepository;
use App\Repository\ResidentialComplexRepository;
use App\ResidentialComplex;
use App\Services\ResidentialComplexService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;

class HomeController extends Controller
{
    /** @var DistrictRepository */
    public $districtRepository;

    /** @var DeveloperRepository */
    public $developerRepository;

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

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

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

    public function districtStatistics()
    {
        if (Cache::has(District::CACHE_KEY_MAIN_PAGE_RESULT)) {
            $statistic = $statistic = $this->districtRepository->districtStatistic();
        } else {
            $statistic = $this->districtRepository->districtStatistic();
            Cache::put(District::CACHE_KEY_MAIN_PAGE_RESULT, $statistic, CacheTimeHelper::ONE_DAY);
        }

        return new DistrictCollection($statistic, ['show_building_count' => true]);
    }

    public function residentialComplexes(Request $request)
    {
        $parameters = [];
        $user = auth('api')->user();
        if ($user) {
            $parameters = ['user' => $user->id];
        }

        $residentialComplexes = $this->residentialComplexesRepository->listResidentialComplex($parameters, true);

//        if (Cache::has(ResidentialComplex::CACHE_KEY_MAIN_PAGE_RESULT)) {
//            $residentialComplexes = Cache::get(ResidentialComplex::CACHE_KEY_MAIN_PAGE_RESULT);
//        } else {
//            $residentialComplexes = $this->residentialComplexesRepository->listResidentialComplex($parameters);
//            Cache::put(ResidentialComplex::CACHE_KEY_MAIN_PAGE_RESULT, $residentialComplexes, CacheTimeHelper::TWENTY_MINUTES);
//        }

        return [
            'data' => new ResidentialComplexCollection($residentialComplexes, [
                'portrait' => true,
                'collection' => true
            ]),
            'count' => $this->residentialComplexService->cachedResidentialComplexesCount()
        ];
    }

    public function developers()
    {
        $developers = $this->developerRepository->developerMain();
        $count = Developer::query()->where('developers.enabled', 1)->count();

//        if (Cache::has(Developer::CACHE_KEY_MAIN_PAGE_RESULT)) {
//            $developers = Cache::get(Developer::CACHE_KEY_MAIN_PAGE_RESULT);
//            $count = Cache::get(Developer::CACHE_KEY_MAIN_PAGE_COUNT);
//        } else {
//            $developers = $this->developerRepository->developerMain();
//            $count = Developer::query()->where('developers.enabled', 1)->count();
//
//            Cache::put(Developer::CACHE_KEY_MAIN_PAGE_COUNT, $count, CacheTimeHelper::ONE_DAY);
//            Cache::put(Developer::CACHE_KEY_MAIN_PAGE_RESULT, $developers, CacheTimeHelper::ONE_DAY);
//        }

        return ['data' => new DeveloperCollection($developers), 'count' => $count ];
    }

    public function markerFilter(Request $request, $RCCode)
    {
        $markers = Marker::query()
            ->with('infrastructure_type')
            ->leftJoin('residential_complex_markers as rcm', 'markers.id', '=', 'rcm.marker_id')
            ->leftJoin('residential_complexes as rc', 'rcm.residential_complex_id', '=',  'rc.id')
            ->where('rc.code', $RCCode)
            ->select('markers.*')
            ->groupBy('markers.id')
            ->get();

        return $markers->toArray();
    }
}
