<?php

namespace App\Http\Resources;

use App\Http\Resources\ResidentialComplex\ResidentialComplexBanks;
use App\Http\Resources\ResidentialComplex\ResidentialComplexCharacteristics;
use App\Http\Resources\ResidentialComplex\ResidentialComplexCourseOfConstruction;
use App\Http\Resources\ResidentialComplex\ResidentialComplexDocument;
use App\Http\Resources\ResidentialComplex\ResidentialComplexFlatPrice;
use App\Http\Resources\ResidentialComplex\ResidentialComplexGeneralRating;
use App\Http\Resources\ResidentialComplex\ResidentialComplexLocation;
use App\Http\Resources\ResidentialComplex\ResidentialComplexMarkers;
use App\Http\Resources\ResidentialComplex\ResidentialComplexSecretBuyerRating;
use App\Http\Resources\ResidentialComplex\ResidentialComplexSection;
use App\Repository\DeveloperRepository;
use App\Repository\PlanningPriceRepository;
use App\Repository\PriceRepository;
use App\Repository\PromotionRepository;
use App\Repository\ResidentialComplexRepository;
use App\Services\ResidentialComplexRatingService;
use Illuminate\Http\Resources\Json\JsonResource;

class ResidentialComplexPlanningPrice extends JsonResource
{
    /** @var array */
    private $parameters;

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

        $this->resource = $resource;
        $this->parameters = is_array($parameters) ? $parameters : [];
    }

    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        /** @var \App\ResidentialComplex $residentialComplex */
        $residentialComplex = $this->resource;

        $result_short = [
            "id" => $residentialComplex->id ? $residentialComplex->id : null,
            "name" => $residentialComplex->name ? $residentialComplex->name : "",
            "slug" => $residentialComplex->code ? $residentialComplex->code : "",
        ];

        $result_full = [];
        if (isset($this->parameters['show_residential_complex'])) {
            $pricing = (new PlanningPriceRepository())->fullPrice($residentialComplex->id);

            $result_full = [
                'flats_statistic' => new ResidentialComplexFlatPrice($residentialComplex),
                'pricing' => count($pricing) > 0 ? new SectionPriceCollection($pricing, ['not_format_price' => true]) : [],
            ];
        }

        $result = array_merge($result_short, $result_full);

        return $result;
    }

    public function getSectionFloorUnique($residentialComplex)
    {
        $sections = $residentialComplex->sections()->get();
        $sectionsCount = $sections->count();

        $sectionCollection = collect($sections);
        $sectionsFloors = $sectionCollection->map(function ($item, $key) {
            if ($item->count_of_floor > 0) {
                return $item->count_of_floor;
            }
        });

        $sectionsFloorsUnique = array_unique($sectionsFloors->toArray());

        return [$sectionsCount, $sectionsFloorsUnique];
    }

    public function otherOption($developer, $residentialComplex)
    {
        $parameters = [
            'developer_id' => $developer ? $developer->id : null,
            'hide_residential_complex_id' => $residentialComplex ? $residentialComplex->id : null,
            'statistic' => true,
            'developer_residential_complex' => true
        ];

        if ($developer) {
            $residentialComplexDeveloper = (new DeveloperRepository())->find($parameters);

            /** @var \App\ResidentialComplex $residentialComplex */
            $developerResidentialComplexes =
                (new ResidentialComplexRepository())->listResidentialComplex($parameters);
            if (count($developerResidentialComplexes) == 0) {
                $developerResidentialComplexes = $residentialComplex->
                recomended_residental_complex_id()
                    ->where('enabled', true)
                    ->take(3)
                    ->get();
            }

            $developerPromotion = (new PromotionRepository())->listOfPromotion(3, $parameters);

            return [$residentialComplexDeveloper, $developerResidentialComplexes, $developerPromotion];
        }

        return [];
    }
}
