<?php

namespace App\Http\Resources\ResidentialComplex;

use App\Helpers\ImageSize;
use App\Marker;
use App\MarkerType;
use App\ResidentialComplex;
use App\Services\ResidentialComplexService;
use Illuminate\Http\Resources\Json\JsonResource;

class ResidentialComplexMarkers extends JsonResource
{
    protected $residentialComplexService;

    /**
     * Create a new resource instance.
     *
     * @param  mixed $resource
     * @param array $parameters
     */
    public function __construct($resource)
    {
        parent::__construct($resource);
        $this->resource = $resource;

        $this->residentialComplexService = \App::make(ResidentialComplexService::class);
    }

    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request $request
     * @return array
     */
    public function toArray($request)
    {
        $result = [];
        /** @var ResidentialComplex $residentialComplex */
        $residentialComplex = $this;
        $city = $residentialComplex->city ? $residentialComplex->city : null;
        $markerType = MarkerType::query()->where('code', 'centr-mista')->first();
        $result['city_center'] = [
            'code' => $markerType ? $markerType->code : "",
            'type' => $markerType ? $markerType->type : "",
            'icon' => [
                'default' => $markerType ?
                    asset(env('UPLOAD_PATH') . '/' . ImageSize::MARKER_TYPE . '/' . $markerType->image) : "",
            ],
        ];
        $result['city_center']['coordinates'] = [
            'longitude' => $city ? $city->center_longitude : "",
            'latitude' => $city ? $city->center_latitude : "",
        ];

//        $markers = $residentialComplex
//            ->markers()
//            ->whereNull('deleted_at')
//            ->orderBy('infrastructure_type_id')
//            ->get();

        $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')
            ->leftJoin('marker_types as mt', 'markers.infrastructure_type_id', '=', 'mt.id')
            ->whereNull('markers.deleted_at')
            ->where('rcm.residential_complex_id', $residentialComplex->id)
            ->select('markers.*')
            ->groupBy('markers.id')
            ->get();

        /** @var Marker $marker */
        foreach ($markers as $marker) {
            $markerType = $marker->infrastructure_type()->first() ? $marker->infrastructure_type()->first() : null;
            if ($markerType) {
                $markerTypeCode = $markerType->code;
                if ($residentialComplex->location_longitude > 0 && $marker->address_longitude > 0) {
                    $distance = $this->residentialComplexService->haversineGreatCircleDistance(
                        $residentialComplex->location_latitude,
                        $residentialComplex->location_longitude,
                        $marker->address_latitude,
                        $marker->address_longitude
                    );
                    if (!isset($result[$markerTypeCode])) {
//                        $result[$markerTypeCode]['id'] = $markerType->id;
                        $result[$markerTypeCode]['code'] = $markerType->code;
                        $result[$markerTypeCode]['type'] = $markerType->type;
                        $result[$markerTypeCode]['icon'] = [
                            'default' => asset(env('UPLOAD_PATH') . '/' .
                                ImageSize::MARKER_TYPE . '/' . $markerType->image),
                        ];
                    }
                    if (!isset($result[$markerTypeCode]['distance']) && isset($distance) && $distance >= 0) {
                        $result[$markerTypeCode]['distance'] = $distance;
                        $result[$markerTypeCode]['coordinates'] = [
                            'longitude' => $marker->address_longitude,
                            'latitude' => $marker->address_latitude,
                        ];
                    } elseif (isset($result[$markerTypeCode]['distance']) && isset($distance) && $distance >= 0) {
                        if ($result[$markerTypeCode]['distance'] > $distance) {
                            $result[$markerTypeCode]['distance'] = $distance;
                            $result[$markerTypeCode]['coordinates'] = [
                                'longitude' => $marker->address_longitude,
                                'latitude' => $marker->address_latitude,
                            ];
                        }
                    }
                }
            }
        }

        return $result;
    }
}
