<?php

namespace App\Repository;

use App\District;
use App\Promotion;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\DB;

class PromotionRepository
{
    const PROMOTION_FIRST_PAGE = 18;
    const PROMOTION_PAGE = 9;

    public function listOfPromotion($count, $parameters = [])
    {
        $promotions = Promotion::query()
            ->leftJoin('residential_complexes as rc', 'promotions.residental_complex_id', '=', 'rc.id')
            ->leftJoin('developers as d', 'rc.developer_id', '=', 'd.id')
            ->when(isset($parameters['developer_id']), function ($query) use ($parameters) {
                $query
                    ->where('d.id', '=', $parameters['developer_id']);
            })
            ->select(['promotions.*'])
            ->limit($count)
            ->orderBy('promotions.main_page_priority', "desc")
            ->groupBy('promotions.id');


        return $promotions->get();
    }

    public function find($parameters)
    {
        $promotionQuery = Promotion::query();
        $promotionQuery
            ->leftJoin('residential_complexes as rc', 'promotions.residental_complex_id', '=', 'rc.id')
            ->leftJoin('district as ds', 'rc.district_id', '=', 'ds.id')
            ->leftJoin('cities as ct', 'rc.city_id', '=', 'ct.id')
            ->leftJoin('regions as rg', 'ct.region_id', '=', 'rg.id');
        $promotionQuery->when(isset($parameters['district_code']), function (Builder $query) use ($parameters) {
            if ($parameters['district_code'] == District::ALL) {
                $query->where('rg.code', '=', 'lviv');
            } elseif ($parameters['district_code'] == District::FRANKIVSKYJ) {
                $query->where('ds.code', '=', District::FRANKIVSKYJ)
                ->where('ct.region_center', true);
            } elseif ($parameters['district_code'] == District::HALYTSKYI) {
                $query->where('ds.code', '=', District::HALYTSKYI)
                    ->where('ct.region_center', true);
            } elseif ($parameters['district_code'] == District::LYCHAKIV) {
                $query->where('ds.code', '=', District::LYCHAKIV)
                    ->where('ct.region_center', true);
            } elseif ($parameters['district_code'] == District::SHEVCHENKIVSKYI) {
                $query->where('ds.code', '=', District::SHEVCHENKIVSKYI)
                    ->where('ct.region_center', true);
            } elseif ($parameters['district_code'] == District::SYKHIV) {
                $query->where('ds.code', '=', District::SYKHIV)
                    ->where('ct.region_center', true);
            } elseif ($parameters['district_code'] == District::ZALIZNYCHNYI) {
                $query->where('ds.code', '=', District::ZALIZNYCHNYI)
                    ->where('ct.region_center', true);
            } elseif ($parameters['district_code'] == District::REGION) {
                $query
                    ->where('rg.code', '=', 'lviv')
                    ->where('ct.region_center', false);
            } elseif ($parameters['district_code'] == District::LVIV_DISTRICT_ALL) {
                $query
                    ->where('rg.code', '=', 'lviv')
                    ->where('ct.region_center', true);
            }
        })
        ->select(['promotions.*'])
        ->when(isset($parameters['district_page']), function (Builder $query) use ($parameters) {
            if ($parameters['district_page'] == 0) {
                $resultCount = self::PROMOTION_FIRST_PAGE;
                $skip = $parameters['district_page'];

            } else {
                $resultCount = self::PROMOTION_PAGE;
                $skip =  ($parameters['district_page'] * self::PROMOTION_PAGE) + self::PROMOTION_PAGE;
            }
            $query->skip($skip)->take($resultCount);
        });

        $promotionQuery->orderBy('promotions.promotion_page_priority', "desc");

        return $promotionQuery->get();
    }
}
