<?php

namespace App\Repository;

use App\Developer;

class DeveloperRepository
{
    const OFFSET_COUNT = 8;

    const WISH_LIST_OFFSET_COUNT = 2;

    const BUILD = "build";
    const ROOM_COUNT = "room_count";
    const BEING_BUILT = "being_built";
    const POPULAR = "popular";

    public function developerMain()
    {
        $developers = Developer::query()
            ->limit(6)
            ->orderBy('main_page_priority', "desc")
            ->get();

        return $developers;
    }

    public function find($parameters = null)
    {
        $developers = Developer::query()
            ->limit(6)
            ->leftJoin('residential_complexes as rc', "developers.id", '=', 'rc.developer_id')
            ->leftJoin('stage_of_constructions as sc', 'rc.stage_of_construction_id', '=', 'sc.id')
            ->select([
                "developers.*",
            ])

//            ->selectRaw("sum(case when (sc.code='build' AND rc.deleted_at is null)then 1 else 0 end) as build")
//            ->selectRaw("sum(case when (sc.code='being_built' AND rc.deleted_at is null)then 1 else 0 end)
//                as being_built")
//            ->selectRaw("sum(case when (rc.start_of_sale = 1 AND rc.deleted_at is null)then rc.room_count else 0 end)
//                         as room_count")

            ->when(isset($parameters['page']), function ($query) use ($parameters) {
                $query->skip($parameters['page'] * self::OFFSET_COUNT)->take(self::OFFSET_COUNT);
            })

            ->when(isset($parameters['wishList_page']), function ($query) use ($parameters) {
                $query->skip($parameters['wishList_page'] * self::WISH_LIST_OFFSET_COUNT)->
                take(self::WISH_LIST_OFFSET_COUNT);
            })

            ->when(isset($parameters['wishList_user']), function ($query) use ($parameters) {
                $query->leftJoin('wishlist_user_developers as wld', 'wld.developer_id', '=', 'developers.id')
                    ->where('wld.user_id', '=', $parameters['wishList_user']);
            })

            ->where('developers.enabled', 1)
            ->when(isset($parameters['code']), function ($query) use ($parameters) {
                if ($parameters['code'] == self::BEING_BUILT) {
                    $query->orderBy('developers.being_built', "desc");
                } elseif ($parameters['code'] == self::POPULAR) {
                    $query->orderBy('developers.developer_page_priority', "desc");
                } elseif ($parameters['code'] == self::BUILD) {
                    $query->orderBy('developers.build', "desc");
                } elseif ($parameters['code'] == self::ROOM_COUNT) {
                    $query->orderBy('room_count', "desc");
                }
            })

            ->when(isset($parameters['developer_id']), function ($query) use ($parameters) {
                $query->where('developers.id', '=', $parameters['developer_id']);
            })

            ->when(isset($parameters['developer_slug']), function ($query) use ($parameters) {
                $query->where('developers.code', '=', $parameters['developer_slug']);
            })

            ->when(isset($parameters['developer_ids']), function ($query) use ($parameters) {
                $query->whereIn('developers.id', $parameters['developer_ids']);
            })
            ->groupBy('developers.id')
            ->get();

        return $developers;
    }
}
