<?php

namespace App\Services;

use App\Repository\ResidentialComplexRepository;
use App\ResidentialComplex;

class ResidentialComplexRatingService
{
    public $customerRating;

    public $secretBuyerRating;

    public $customerAndSecretBuyerRatingCount;

    public function __construct(ResidentialComplex $residentialComplex)
    {
        $this->customerRating = $this->customerRatingAVG($residentialComplex);
        $this->secretBuyerRating = $this->secretRating($residentialComplex);
        $this->customerAndSecretBuyerRatingCount = $this->customerAndSecretBuyerRatingCount($residentialComplex);
    }

    public function customerRating($residentialComplex)
    {
        $position = $residentialComplex->rating_position ? $residentialComplex->rating_position : 0;
        $transportHub = $residentialComplex->rating_transport_hub ? $residentialComplex->rating_transport_hub : 0;
        $planning = $residentialComplex->rating_planning ? $residentialComplex->rating_planning : 0;
        $priceQuality = $residentialComplex->rating_price_quality ? $residentialComplex->rating_price_quality : 0;
        $infrastructure = $residentialComplex->rating_infrastructure ? $residentialComplex->rating_infrastructure : 0;
        $average = ($position + $transportHub + $planning + $priceQuality + $infrastructure) / 5;

        return [$average, $position, $transportHub, $planning, $priceQuality, $infrastructure];
    }

    public function secretRating($residentialComplex)
    {
        /** @var \App\ResidentialComplex $residentialComplex */
        $rating = (new ResidentialComplexRepository)
            ->secretBuyerAVGRating(['code' => $residentialComplex->code])->first();

        $position = isset($rating) ? $rating->rating_position : 0;
        $transportHub = isset($rating) ? $rating->rating_transport_hub : 0;
        $planning = isset($rating) ? $rating->rating_planning : 0;
        $priceQuality = isset($rating) ? $rating->rating_price_quality : 0;
        $infrastructure = isset($rating) ? $rating->rating_infrastructure : 0;
        $average = ($position + $transportHub + $planning + $priceQuality + $infrastructure) / 5;

        return [
            'sbr_position' => $position,
            'sbr_transport_hub' => $transportHub,
            'sbr_planning' => $planning,
            'sbr_quality' => $priceQuality,
            'sbr_infrastructure' => $infrastructure,
            'sbr_average' => $average
        ];
    }

    public function customerRatingAVG($residentialComplex)
    {
        /** @var \App\ResidentialComplex $residentialComplex */
        $rating = (new ResidentialComplexRepository)->customerAVGRating(['code' => $residentialComplex->code])->first();

        $position = isset($rating) ? $rating->rating_position : 0;
        $transportHub = isset($rating)  ? $rating->rating_transport_hub : 0;
        $planning = isset($rating) ? $rating->rating_planning : 0;
        $priceQuality = isset($rating) ? $rating->rating_price_quality : 0;
        $infrastructure = isset($rating)  ? $rating->rating_infrastructure : 0;
        $average = ($position + $transportHub + $planning + $priceQuality + $infrastructure) / 5;

        return [
            'customer_position' => $position,
            'customer_transport_hub' => $transportHub,
            'customer_planning' => $planning,
            'customer_quality' => $priceQuality,
            'customer_infrastructure' => $infrastructure,
            'customer_average' => $average
        ];
    }

    public function avgRating()
    {
        list($customerRatingCount, $secretBuyerRatingCount, $customerRatingAVG, $secretBuyerAVG)
            = $this->generalRatingData();

        $customerRatingAverage = $customerRatingAVG['customer_average'] > 0 ?
            $customerRatingAVG['customer_average'] : 0;
        $secretBuyerRating = $secretBuyerAVG['sbr_average'] > 0 ?
            $secretBuyerAVG['sbr_average'] : 0;

        if ($customerRatingCount > 0 && $secretBuyerRatingCount > 0) {
            $avg = ($customerRatingAverage + $secretBuyerRating) / 2;
        } elseif ($customerRatingCount > 0 && $secretBuyerRatingCount == 0) {
            $avg = $customerRatingAverage;
        } elseif ($customerRatingCount == 0 && $secretBuyerRatingCount > 0) {
            $avg = $secretBuyerRating;
        }

        return isset($avg) ? $avg : 0;
    }

    protected function customerAndSecretBuyerRatingCount($residentialComplex)
    {
        /** @var ResidentialComplex $residentialComplex */
        $customerRatingCount = $residentialComplex->customerRating()->whereNull('deleted_at')
            ->where('enabled', 1)->get()->count();
        $residentialComplexСustomerRatingCount = $residentialComplex->customer_rating_count;

        $result[] = $customerRatingCount + $residentialComplexСustomerRatingCount;
        $result[] = $residentialComplex->secretBuyerRating()->whereNull('deleted_at')
            ->where('enabled', 1)->get()->count();

        return $result;
    }

    public function customerRatingGeneralAVG()
    {
        $result = [];
        list($customerRatingCount, $secretBuyerRatingCount, $customerRating, $secretBuyerRating)
            = $this->generalRatingData();

        if ($customerRatingCount > 0 && $secretBuyerRatingCount > 0) {
            $result = [
                'position' =>
                    ($customerRating['customer_position'] + $secretBuyerRating['sbr_position']) / 2,
                'transport_hub' =>
                    ($customerRating['customer_transport_hub'] + $secretBuyerRating['sbr_transport_hub']) / 2,
                'planning' =>
                    ($customerRating['customer_planning'] + $secretBuyerRating['sbr_planning']) / 2,
                'quality' =>
                    ($customerRating['customer_quality'] + $secretBuyerRating['sbr_quality']) / 2,
                'infrastructure' =>
                    ($customerRating['customer_infrastructure'] + $secretBuyerRating['sbr_infrastructure']) / 2,
                'average' =>
                    ($customerRating['customer_average'] + $secretBuyerRating['sbr_average']) / 2,
            ];
        } elseif ($customerRatingCount > 0 && $secretBuyerRatingCount == 0) {
            $result = [
                'position' => $customerRating['customer_position'],
                'transport_hub' => $customerRating['customer_transport_hub'],
                'planning' => $customerRating['customer_planning'],
                'quality' => $customerRating['customer_quality'],
                'infrastructure' => $customerRating['customer_infrastructure'],
                'average' => $customerRating['customer_average'],
            ];
        } elseif ($customerRatingCount == 0 && $secretBuyerRatingCount > 0) {
            $result = [
                'position' => $secretBuyerRating['sbr_position'],
                'transport_hub' => $secretBuyerRating['sbr_transport_hub'],
                'planning' => $secretBuyerRating['sbr_planning'],
                'quality' => $secretBuyerRating['sbr_quality'],
                'infrastructure' => $secretBuyerRating['sbr_infrastructure'],
                'average' => $secretBuyerRating['sbr_average'],
            ];
        } else {
            $result = [
                'position' => 0,
                'transport_hub' => 0,
                'planning' => 0,
                'quality' => 0,
                'infrastructure' => 0,
                'average' => 0,
            ];
        }

        $result['customer_count'] = $customerRatingCount;
        $result['secret_buyer_count'] = $secretBuyerRatingCount;

        return $result;
    }

    public function generalRatingData()
    {
        list($customerRatingCount, $secretBuyerRatingCount) =
            $this->customerAndSecretBuyerRatingCount;
        $customerRatingAVG = $this->customerRating;
        $secretBuyerAVG = $this->secretBuyerRating;

        return [
            $customerRatingCount,
            $secretBuyerRatingCount,
            $customerRatingAVG,
            $secretBuyerAVG
        ];
    }
}
