<?php
/**
 * Created by PhpStorm.
 * User: Andriy
 * Date: 06.02.2020
 * Time: 11:27
 */

namespace App\Services;

use App\Price;
use App\RoomType;

class ResidentialComplexPriceGenerator
{
    public function compareGeneralPrice($planningStatistics, $prices, $residentialComplex)
    {
        if (isset($planningStatistics['general_room_status']) && count($planningStatistics['general_room_status']) > 0) {
            foreach ($planningStatistics['general_room_status'][0]['statistic'] as $planningStatisticRoom) {
                $isRoomExist = false;
                if (isset($prices['general']) && count($prices['general']) > 0) {
                    foreach ($prices['general'][0]['statistic'] as $priceRoom) {
                        if (($planningStatisticRoom['room_count'] == $priceRoom['room_count'] && !empty($planningStatisticRoom['room_count']) && !empty($priceRoom['room_count'] && empty($priceRoom['room_type']))) || ($planningStatisticRoom['room_type'] == $priceRoom['room_type'] && !empty($planningStatisticRoom['room_type']) && !empty($priceRoom['room_type']))) {
                            $isRoomExist = true;
                        }
                    }
                }
                if ($isRoomExist == false && (!empty($planningStatisticRoom['min_price']) || !empty($planningStatisticRoom['min_space']))) {
                    $price = new Price();
                    $price->residential_complex_id = $residentialComplex->id;
                    $price->room_count_id = $planningStatisticRoom['room_count'];
                    $price->room_type_id = $planningStatisticRoom['room_type_id'];
                    $price->min_price = $planningStatisticRoom['min_price'];
                    $price->max_price = $planningStatisticRoom['max_price'];
                    $price->min_space = $planningStatisticRoom['min_space'];
                    $price->max_space = $planningStatisticRoom['max_space'];
                    $price->price_per_squera_meter = $planningStatisticRoom['min_cost_per_square_meter'];
                    $price->save();
                }
            }
        }
    }

    public function compareSectionPrice($planningStatistics, $prices, $residentialComplex)
    {
        if (isset($planningStatistics['section_rooms_status']) && count($planningStatistics['section_rooms_status']) > 0) {
            foreach ($planningStatistics['section_rooms_status'] as $planningStatisticSection) {
                $planningStatisticBuildingName = $planningStatisticSection['section_name'];
                foreach ($planningStatisticSection['statistic'] as $planningStatisticSectionRoom) {
                    $isRoomExist = false;
                    if (isset($prices['sections']) && count($prices['sections']) > 0) {
                        foreach ($prices['sections'] as $priceSection) {
                            $priceBuildingName = $priceSection['section_name'];
                            foreach ($priceSection['statistic'] as $priceSectionRoom) {
                                if ($planningStatisticBuildingName == $priceBuildingName) {
                                    if (($planningStatisticSectionRoom['room_count'] == $priceSectionRoom['room_count'] && !empty($planningStatisticSectionRoom['room_count']) && !empty($priceSectionRoom['room_count'] && empty($priceSectionRoom['room_type']))) || ($planningStatisticSectionRoom['room_type'] == $priceSectionRoom['room_type'] && !empty($planningStatisticSectionRoom['room_type']) && !empty($priceSectionRoom['room_type']))) {
                                        $isRoomExist = true;
                                    }
                                }
                            }
                        }
                    }
                    if ($isRoomExist == false && (!empty($planningStatisticSectionRoom['min_price']) || !empty($planningStatisticSectionRoom['min_space']))) {
                        $price = new Price();
                        $price->residential_complex_id = $residentialComplex->id;
                        $price->section_id = $planningStatisticSection['id'];
                        $price->room_count_id = $planningStatisticSectionRoom['room_count'];
                        $price->room_type_id = $planningStatisticSectionRoom['room_type_id'];
                        $price->min_price = $planningStatisticSectionRoom['min_price'];
                        $price->max_price = $planningStatisticSectionRoom['max_price'];
                        $price->min_space = $planningStatisticSectionRoom['min_space'];
                        $price->max_space = $planningStatisticSectionRoom['max_space'];
                        $price->price_per_squera_meter = $planningStatisticSectionRoom['min_cost_per_square_meter'];
                        $price->save();
                    }
                }
            }
        }
    }

    public function generateGeneralPrice($prices)
    {
        if (isset($prices['sections']) && count($prices['sections']) > 0) {
            $arrayOfPrices = [];
            foreach ($prices['sections'] as $priceSection) {
                foreach ($priceSection['statistic'] as $key => $priceSectionRoom) {
                    if (!empty($priceSectionRoom['room_count']) && empty($priceSectionRoom['room_type']))
                    {
                        if (!isset($arrayOfPrices[$priceSectionRoom['room_count']])) {
                            $arrayOfPrices[$priceSectionRoom['room_count']] = [
                                'room_count' => isset($priceSectionRoom['room_count'])
                                    ? $priceSectionRoom['room_count'] : null,
                                'room_type' => isset($priceSectionRoom['room_type'])
                                    ? $priceSectionRoom['room_type'] : null,
                                'min_price' => isset($priceSectionRoom['min_price'])
                                    ? $priceSectionRoom['min_price'] : null,
                                'max_price' => isset($priceSectionRoom['max_price'])
                                    ? $priceSectionRoom['max_price'] : null,
                                'min_space' => isset($priceSectionRoom['min_space'])
                                    ? $priceSectionRoom['min_space'] : null,
                                'max_space' => isset($priceSectionRoom['max_space'])
                                    ? $priceSectionRoom['max_space'] : null,
                                'price_per_squera_meter' => isset($priceSectionRoom['price_per_squera_meter'])
                                    ? $priceSectionRoom['price_per_squera_meter'] : null,
                                'price_per_squera_meter_max' => isset($priceSectionRoom['price_per_squera_meter_max'])
                                    ? $priceSectionRoom['price_per_squera_meter_max'] : null,
                                'number_of_apartments' => isset($priceSectionRoom['number_of_apartments'])
                                    ? $priceSectionRoom['number_of_apartments'] : null,
                            ];
                        } else {
                            if (!empty($arrayOfPrices[$priceSectionRoom['room_count']]['min_price'])
                                ||
                                !empty($priceSectionRoom['min_price'])
                            ) {
                                $arrayOfPrices[$priceSectionRoom['room_count']]['min_price'] = $arrayOfPrices[$priceSectionRoom['room_count']]['min_price'] > $priceSectionRoom['min_price'] ? $priceSectionRoom['min_price'] : $arrayOfPrices[$priceSectionRoom['room_count']]['min_price'];
                            }

                            if (!empty($arrayOfPrices[$priceSectionRoom['room_count']]['max_price'])
                                ||
                                !empty($priceSectionRoom['max_price'])
                            ) {
                                $arrayOfPrices[$priceSectionRoom['room_count']]['max_price'] = $arrayOfPrices[$priceSectionRoom['room_count']]['max_price'] > $priceSectionRoom['max_price'] ? $arrayOfPrices[$priceSectionRoom['room_count']]['max_price'] : $priceSectionRoom['max_price'];
                            }


                            if (!empty($arrayOfPrices[$priceSectionRoom['room_count']]['min_space'])
                                ||
                                !empty($priceSectionRoom['min_space'])
                            ) {
                                $arrayOfPrices[$priceSectionRoom['room_count']]['min_space'] = $arrayOfPrices[$priceSectionRoom['room_count']]['min_space'] > $priceSectionRoom['min_space'] ? $priceSectionRoom['min_space']
                                    : $arrayOfPrices[$priceSectionRoom['room_count']]['min_space'];
                            }

                            if (!empty($arrayOfPrices[$priceSectionRoom['room_count']]['max_space'])
                                ||
                                !empty($priceSectionRoom['max_space'])
                            ) {
                                $arrayOfPrices[$priceSectionRoom['room_count']]['max_space'] = $arrayOfPrices[$priceSectionRoom['room_count']]['max_space'] > $priceSectionRoom['max_space'] ? $arrayOfPrices[$priceSectionRoom['room_count']]['max_space'] : $priceSectionRoom['max_space'];
                            }



                            if (!empty($arrayOfPrices[$priceSectionRoom['room_count']]['price_per_squera_meter'])
                                ||
                                !empty($priceSectionRoom['price_per_squera_meter'])
                            ) {
                                $arrayOfPrices[$priceSectionRoom['room_count']]['price_per_squera_meter'] = $arrayOfPrices[$priceSectionRoom['room_count']]['price_per_squera_meter'] > $priceSectionRoom['price_per_squera_meter'] ?
                                    $priceSectionRoom['price_per_squera_meter'] : $arrayOfPrices[$priceSectionRoom['room_count']]['price_per_squera_meter'];
                            }

                            if (!empty($arrayOfPrices[$priceSectionRoom['room_count']]['price_per_squera_meter_max'])
                                ||
                                !empty($priceSectionRoom['price_per_squera_meter_max'])
                            ) {
                                $arrayOfPrices[$priceSectionRoom['room_count']]['price_per_squera_meter_max'] =
                                    $arrayOfPrices[$priceSectionRoom['room_count']]['price_per_squera_meter_max']
                                    > $priceSectionRoom['price_per_squera_meter_max']
                                        ? $arrayOfPrices[$priceSectionRoom['room_count']]['price_per_squera_meter_max']
                                        : $priceSectionRoom['price_per_squera_meter_max'];
                            }


                        }

                    } elseif (!empty($priceSectionRoom['room_type'])) {
                        if (!isset($arrayOfPrices[$priceSectionRoom['room_type']])) {
                            $arrayOfPrices[$priceSectionRoom['room_type']] = [
                                'room_count' => isset($priceSectionRoom['room_count'])
                                    ? $priceSectionRoom['room_count'] : null,
                                'room_type' => isset($priceSectionRoom['room_type'])
                                    ? $priceSectionRoom['room_type'] : null,
                                'min_price' => isset($priceSectionRoom['min_price'])
                                    ? $priceSectionRoom['min_price'] : null,
                                'max_price' => isset($priceSectionRoom['max_price'])
                                    ? $priceSectionRoom['max_price'] : null,
                                'min_space' => isset($priceSectionRoom['min_space'])
                                    ? $priceSectionRoom['min_space'] : null,
                                'max_space' => isset($priceSectionRoom['max_space'])
                                    ? $priceSectionRoom['max_space'] : null,
                                'price_per_squera_meter' => isset($priceSectionRoom['price_per_squera_meter'])
                                    ? $priceSectionRoom['price_per_squera_meter'] : null,
                                'price_per_squera_meter_max' => isset($priceSectionRoom['price_per_squera_meter_max'])
                                    ? $priceSectionRoom['price_per_squera_meter_max'] : null,
                                'number_of_apartments' => isset($priceSectionRoom['number_of_apartments'])
                                    ? $priceSectionRoom['number_of_apartments'] : null,
                            ];
                        } else {
                            if (!empty($arrayOfPrices[$priceSectionRoom['room_type']]['min_price'])
                                ||
                                !empty($priceSectionRoom['min_price'])
                            ) {
                                $arrayOfPrices[$priceSectionRoom['room_type']]['min_price'] = $arrayOfPrices[$priceSectionRoom['room_type']]['min_price'] > $priceSectionRoom['min_price'] ? $priceSectionRoom['min_price'] : $arrayOfPrices[$priceSectionRoom['room_type']]['min_price'];
                            }

                            if (!empty($arrayOfPrices[$priceSectionRoom['room_type']]['max_price'])
                                ||
                                !empty($priceSectionRoom['max_price'])
                            ) {
                                $arrayOfPrices[$priceSectionRoom['room_type']]['max_price'] = $arrayOfPrices[$priceSectionRoom['room_type']]['max_price'] > $priceSectionRoom['max_price'] ? $arrayOfPrices[$priceSectionRoom['room_type']]['max_price'] : $priceSectionRoom['max_price'];
                            }


                            if (!empty($arrayOfPrices[$priceSectionRoom['room_type']]['min_space'])
                                ||
                                !empty($priceSectionRoom['min_space'])
                            ) {
                                $arrayOfPrices[$priceSectionRoom['room_type']]['min_space'] =
                                    $arrayOfPrices[$priceSectionRoom['room_type']]['min_space'] > $priceSectionRoom['min_space'] ?
                                    $priceSectionRoom['min_space'] : $arrayOfPrices[$priceSectionRoom['room_type']]['min_space'];
                            }

                            if (!empty($arrayOfPrices[$priceSectionRoom['room_type']]['max_space'])
                                ||
                                !empty($priceSectionRoom['max_space'])
                            ) {
                                $arrayOfPrices[$priceSectionRoom['room_type']]['max_space'] = $arrayOfPrices[$priceSectionRoom['room_type']]['max_space'] > $priceSectionRoom['max_space'] ? $arrayOfPrices[$priceSectionRoom['room_type']]['max_space'] : $priceSectionRoom['max_space'];
                            }


                            if (!empty($arrayOfPrices[$priceSectionRoom['room_type']]['price_per_squera_meter'])
                                ||
                                !empty($priceSectionRoom['price_per_squera_meter'])
                            ) {
                                $arrayOfPrices[$priceSectionRoom['room_type']]['price_per_squera_meter'] = $arrayOfPrices[$priceSectionRoom['room_type']]['price_per_squera_meter'] > $priceSectionRoom['price_per_squera_meter'] ?
                                    $priceSectionRoom['price_per_squera_meter'] : $arrayOfPrices[$priceSectionRoom['room_type']]['price_per_squera_meter'];
                            }
                            if (!empty($arrayOfPrices[$priceSectionRoom['room_type']]['price_per_squera_meter_max'])
                                ||
                                !empty($priceSectionRoom['price_per_squera_meter_max'])
                            ) {
                                $arrayOfPrices[$priceSectionRoom['room_type']]['price_per_squera_meter_max'] = $arrayOfPrices[$priceSectionRoom['room_type']]['price_per_squera_meter_max'] > $priceSectionRoom['price_per_squera_meter_max'] ? $arrayOfPrices[$priceSectionRoom['room_type']]['price_per_squera_meter_max'] : $priceSectionRoom['price_per_squera_meter_max'];
                            }
                        }
                    }
                }
            }

            return isset($arrayOfPrices) ? $arrayOfPrices : [];
        }

        return isset($arrayOfPrices) ? $arrayOfPrices : [];
    }

    public function createGeneralPrice($prices, $residentialComplex)
    {
        $roomTypes = RoomType::all();
        foreach ($prices as $priceItem) {
            $price = new Price();
            $price->residential_complex_id = $residentialComplex->id;
            $price->room_count_id = $priceItem['room_count'];
            if (!empty($priceItem['room_type'])) {
                foreach ($roomTypes as $roomType) {
                    if ($roomType->code == $priceItem['room_type']) {
                        $price->room_type_id = $roomType->id;
                    }
                }
            }

            $price->min_price = $priceItem['min_price'];
            $price->max_price = $priceItem['max_price'];
            $price->min_space = $priceItem['min_space'];
            $price->max_space = $priceItem['max_space'];
            $price->price_per_squera_meter = $priceItem['price_per_squera_meter'];
            $price->price_per_squera_meter_max = $priceItem['price_per_squera_meter_max'];
            $price->save();
        }
    }
}
