<?php

namespace App\Http\Controllers\Frontend;

use App\Components\Functions;
use App\Models\Amenity;
use App\Models\Blog;
use App\Models\Config;
use App\Models\Hostel;
use App\Models\Room;
use App\Models\RoomNeedMore;
use App\Models\Testimonial;
use Carbon\Carbon;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Redis;

class MapController extends Controller
{
    //
    public function index2(Request $request)
    {

        if ($request->getHost() == 'quanlynhatro.com') {
            if ($request->url() == url('/')) {

            	$blog = Blog::query()
		            ->where('is_sale', true)
		            ->where(function($q) {
		            	$q->orWhere(function($q) {
		            		$q->whereNull('start_date');
		            		$q->where('end_date', '>=', Carbon::now()->toDateString());
			            });
			            $q->orWhere(function($q) {
				            $q->whereNull('end_date');
				            $q->where('start_date', '<=', Carbon::now()->toDateString());
			            });

			            $q->orWhere(function($q) {
				            $q->where('start_date', '<=', Carbon::now()->toDateString())
				              ->where('end_date', '>=', Carbon::now()->toDateString());
			            });
		            })
		            ->orderBy('id', 'desc')
		            ->first();

                return view('frontend3.introduction2', compact('blog'));
            }
        }


        if (str_contains(\request()->getHost(), '.itro.vn')) {
            if ($request->getHost() != 'dev.itro.vn') {
            	$logo =null;
            	$config = Config::where('owner_id', session('owner_id'))->first();
            	if($config)
	            {
	            	if(!empty($config->logo_website)) {
			            $logo = '/files/' . $config->logo_website;
		            }
	            }
                $provinceArr = Hostel::where('owner_id', session('owner_id'))
                    ->pluck('province_id')->unique()->toArray();
                $provinces = \DB::table('province')
                    ->whereIn('provinceid', $provinceArr)->get();
                $amenities = Amenity::where(function ($q) {
                    $q->where('user_id', session('owner_id'));
                    $q->orWhere('user_id', 0);
                })->where('type', Amenity::AMENITY)->get();
                $policies = Amenity::where(function ($q) {
                    $q->where('user_id', session('owner_id'));
                    $q->orWhere('user_id', 0);
                })->where('type', Amenity::POLICY)->get();
                $hostels = Hostel::where('owner_id', session('owner_id'))
                    ->where('number_empty_rooms', '>', 0)
                    ->where('is_display', true)
                    ->get();
                return view('frontend3.owner_search.index', compact('amenities', 'policies', 'provinces', 'checkedAmenities',
                    'type', 'checkedPolicies', 'hostels', 'logo'));
            }
        }

        $hostelHasEmpty = cache()->remember('hostel_has_empty', 180*60, function () {
            return Hostel::where(function ($q) {
                $q->where('number_empty_rooms', '>', 0);
                $q->orWhere('number_empty_rooms', null);
            })->orderBy('id', 'desc')->orderBy('image', 'desc')->take(8)->get();
        });

        $features = cache()->remember('hostel_features', 180*60, function () {
            return Hostel::publish()->featured()->orderBy('id', 'desc')->take(8)->get();
        });
       
        $needMores = cache()->remember('room_need_mores', 180*60, function () {
            return RoomNeedMore::orderBy('id', 'desc')->take(8)->get();
        });


        $testimonials = cache()->remember('testimonials', 180*60, function () {
            return Testimonial::publish()->get();
        });

        if ($request->has('demo')) {
            return view('frontend3.home2', compact('hostelHasEmpty', 'features', 'needMores', 'testimonials'));
        }
        return view('frontend3.home', compact('hostelHasEmpty', 'features', 'needMores', 'testimonials'));
    }

    public function getRoomDetail($slug, $id, Request $request)
    {
        $room = Room::find($id);
        if (!$room) {
            return redirect()->back()->with('error', 'Dữ liệu không hợp lệ');
        }

        $hostel = $room->hostel;
        $amenities = Amenity::join('room_amenities', 'amenities.id', '=', 'room_amenities.amenity_id')
            ->where('room_id', $room->id)->where('type', Amenity::AMENITY)->get();
        $policies = Amenity::join('room_amenities', 'amenities.id', '=', 'room_amenities.amenity_id')
            ->where('room_id', $room->id)->where('type', Amenity::POLICY)->get();

        return view('frontend3.room', compact('room', 'hostel', 'amenities', 'policies'));
    }

    public function index(Request $request)
    {

        $view = $request->input('view');

        $amenities = Amenity::all();
        if (empty($view) || $view == 'listing') {

            $hostelType = $request->input('hostel_type');
            $province = $request->input('province');
            $district = $request->input('district');
            $ward = $request->input('ward');
            $price = $request->input('price');
            $size = $request->input('size');

            $hostels = Hostel::select(\DB::raw('hostels.*, rooms.size as room_size, rooms.price as room_price'))
                ->leftJoin('rooms', 'hostels.id', '=', 'rooms.hostel_id')->groupBy('hostels.id')
                ->orderBy('hostels.id', 'desc');

            if (!empty($hostelType)) {
                $hostels = $hostels->where('hostels.type', $hostelType);
            }
            if (!empty($province)) {
                $hostels = $hostels->where('hostels.province_id', $province);
            }

            if (!empty($district)) {
                $hostels = $hostels->where('hostels.district_id', $district);
            }

            if (!empty($ward)) {
                $hostels = $hostels->where('hostels.ward_id', $ward);
            }

            if (!empty($price)) {
                if ($price > 7) {
                    $hostels = $hostels->where('hostels.price', '>', 15000000);
                } else {
                    $priceP = Functions::getPrice($price);

                    if (!empty($priceP['start']) && !empty($priceP['end'])) {
                        $hostels = $hostels->whereBetween('rooms.price', [$priceP['start'], $priceP['end']]);
                    }
                }
            }

            if (!empty($size)) {
                if ($size > 8) {
                    $hostels = $hostels->where('hostels.size', '>', 100);
                } else {
                    $sizeP = Functions::getSize($size);
                    if (!empty($sizeP['start']) && !empty($sizeP['end'])) {
                        $hostels = $hostels->whereBetween('hostels.size', [$sizeP['start'], $sizeP['end']]);
                    }
                }
            }

            $hostels = $hostels->paginate(20);

            return view('frontend.map.index_hostel_listing', compact('amenities', 'price', 'size', 'hostels', 'hostelType', 'province', 'district', 'ward'));
        }

        return view('frontend.map.index', compact('amenities'));

        //	return view( 'frontend.map.index', compact('amenities') );
    }

    public function getDistrict(Request $request)
    {
        $id = $request->input('id');
        $districts = \DB::table('district')->where('provinceid', $id)->orderBy(\DB::raw('name COLLATE utf8_vietnamese_ci'))->get();
        return view('frontend3.owner_search.select_district', compact('districts'))->render();
    }

    public function setCurrentLatLng(Request $request)
    {
        if (!$request->hasCookie('current-location')) {
            $lat = $request->input('lat');
            $lng = $request->input('lng');

            return response(['lat' => $lat,
                'lng' => $lng])->cookie('current-location', json_encode([
                'lat' => $lat,
                'lng' => $lng
            ]), 60 * 24 * 30);
        }

        $dt = $request->cookie('current-location');
        $currentLocation = json_decode($dt, true);
        $lat = $currentLocation['lat'];
        if ($currentLocation['lat'] != $request->input('lat')) {
            $lat = $request->input('lat');
        }

        $lng = $currentLocation['lng'];
        if ($currentLocation['lng'] != $request->input('lng')) {
            $lng = $request->input('lng');
        }

        return response(['lat' => $lat,
            'lng' => $lng])->cookie('current-location', json_encode([
            'lat' => $lat,
            'lng' => $lng
        ]), 60 * 24 * 30);

    }

    public function getHostel(Request $request)
    {
        $hostels = Hostel::orderBy('id', 'desc')->paginate(21);

        $view = $request->input('view');

        if ($view == 'listing') {
            return response([
                'status' => 1,
                'html' => view('frontend.map.hostel_listings', compact('hostels'))->render()
            ]);
        }

        $itemLocation = [];

        foreach ($hostels as $hostel) {
            if (!empty($hostel->lat) && !empty($hostel->lng)) {
                $itemLocation[] = [
                    'lat' => $hostel->lat,
                    'lng' => $hostel->lng,
                    'name' => $hostel->name,
                    //  'content' => view('frontend.map.info_window', compact('hostel'))->render()
                ];
            }
        }

        if (isset($itemLocation[0])) {
            $center = $itemLocation[0];
        } else {
            $center = [
                'lat' => '21.028511',
                'lng' => '105.804817'
            ];
        }


        return response([
            'status' => 1,
            'locations' => $itemLocation,
            'center' => $center,
            'html' => view('frontend2.hostels', compact('hostels'))->render()
        ]);

    }

    public function search(Request $request)
    {
        $amenities = Amenity::where('type', Amenity::AMENITY)->get();
        $policies = Amenity::where('type', Amenity::POLICY)->get();
        $provinces = Functions::getProvinces();
        $type = 'normal';

        $checkedAmenities = $request->input('amenities');
        $checkedPolicies = $request->input('policies');

        return view('frontend3.search', compact('amenities', 'policies', 'provinces', 'checkedAmenities', 'type', 'checkedPolicies'));
    }

    public function searchNeedMore(Request $request)
    {
        $amenities = Amenity::where('type', Amenity::AMENITY)->get();
        $policies = Amenity::where('type', Amenity::POLICY)->get();
        $provinces = Functions::getProvinces();
        $type = 'need_more';

        $checkedAmenities = $request->input('amenities');
        $checkedPolicies = $request->input('policies');

        return view('frontend3.search_need_more', compact('amenities', 'policies', 'provinces', 'checkedAmenities', 'type', 'checkedPolicies'));
    }

    public function getSearchResultNeedMore(Request $request)
    {
        $province = $request->input('province');
        $district = $request->input('district');
        $ward = $request->input('ward');
        $price = $request->input('price');
        $size = $request->input('size');
        $amenities = $request->input('amenities');
        $policies = $request->input('policies');
        $lat = $request->input('lat');
        $lng = $request->input('lng');

        $q = $request->input('q');

        if (!empty($q)) {
            if (empty($lat) || empty($lng)) {
                $coor = Functions::geocode($q);
                $lat = $coor['lat'];
                $lng = $coor['lng'];
            }
        }

        $hostels = RoomNeedMore::select(\DB::raw('room_need_mores.*'))
            ->orderBy('room_need_mores.id', 'desc');

        if (!empty($province)) {
            $hostels = $hostels->where('room_need_mores.province', $province);
        }

        if (!empty($district)) {
            $hostels = $hostels->where('room_need_mores.district', $district);
        }

        if (!empty($ward)) {
            $hostels = $hostels->where('room_need_mores.ward', $ward);
        }

        if (!empty($price)) {
            if ($price > 7) {
                $hostels = $hostels->where('rooms.price', '>', 15000000);
            } else {
                $priceP = Functions::getPrice($price);

                if (!empty($priceP['start']) && !empty($priceP['end'])) {
                    $hostels = $hostels->whereBetween('room_need_mores.price', [$priceP['start'], $priceP['end']]);
                }
            }
        }

        if (!empty($size)) {
            if ($size > 8) {
                $hostels = $hostels->where('rooms.size', '>', 100);
            } else {
                $sizeP = Functions::getSize($size);
                if (!empty($sizeP['start']) && !empty($sizeP['end'])) {
                    $hostels = $hostels->whereBetween('rooms.size', [$sizeP['start'], $sizeP['end']]);
                }
            }
        }

        if (!empty($amenities)) {
            if (!empty($amenities)) {
                $hostelArr = \DB::table('room_need_more_amenities')->whereIn('amenities_id', $amenities)->groupBy('room_id')
                    ->havingRaw('COUNT(DISTINCT amenities_id) = ' . count($amenities))->pluck('room_id')->toArray();
                $hostels = $hostels->whereIn('room_need_mores.id', $hostelArr);
            }
        }

        if (!empty($policies)) {
            if (!empty($policies)) {
                $hostelArr = \DB::table('room_need_more_amenities')->whereIn('amenities_id', $policies)->groupBy('room_id')
                    ->havingRaw('COUNT(DISTINCT amenities_id) = ' . count($policies))->pluck('room_id')->toArray();
                $hostels = $hostels->whereIn('room_need_mores.id', $hostelArr);
            }
        }

        if (!empty($lat) && !empty($lng)) {
            $hostels = $hostels->isWithinMaxDistance([
                'lat' => $lat,
                'lng' => $lng
            ]);
        }

        $hostels = $hostels->paginate(9);

        $itemLocation = [];

        foreach ($hostels as $hostel) {
            if (!empty($hostel->lat) && !empty($hostel->lng)) {
                $itemLocation[] = [
                    'lat' => $hostel->lat,
                    'lng' => $hostel->lng,
                    'name' => $hostel->name,
                    'content' => view('frontend3.item_need_more_map', compact('hostel'))->render()
                ];
            }
        }

        if (isset($itemLocation[0])) {
            $center = $itemLocation[0];
        } else {
            $center = [
                'lat' => '21.028511',
                'lng' => '105.804817',
                'name' => 'Location'
            ];
        }

        return response([
            'status' => 1,
            'html' => view('frontend3.item_need_mores', compact('hostels'))->render(),
            'url' => str_replace('search-need-more-attr', 'tim-o-ghep', $request->fullUrl()),
            'center' => $center,
            'locations' => $itemLocation
        ]);
    }

    public function getSearchResult(Request $request)
    {
        $hostelType = $request->input('hostel_type');
        $province = $request->input('province');
        $district = $request->input('district');
        $ward = $request->input('ward');
        $price = $request->input('price');
        $size = $request->input('size');
        $amenities = $request->input('amenities');
        $policies = $request->input('policies');
        $lat = $request->input('lat');
        $lng = $request->input('lng');

        $q = $request->input('q');

        if (!empty($q)) {
            if (empty($lat) || empty($lng)) {
                $coor = Functions::geocode($q);
                $lat = $coor['lat'];
                $lng = $coor['lng'];
            }
        }

        $hostels = Hostel::select(\DB::raw('hostels.*, rooms.size as room_size, rooms.price as room_price'))
            ->leftJoin('rooms', 'hostels.id', '=', 'rooms.hostel_id')->groupBy('hostels.id')
            ->where('number_empty_rooms', '>', 0)
            ->orderBy('hostels.id', 'desc');

        if (!empty($hostelType)) {
            $hostels = $hostels->where('hostels.type', $hostelType);
        }
        if (!empty($province)) {
            $hostels = $hostels->where('hostels.province_id', $province);
        }

        if (!empty($district)) {
            $hostels = $hostels->where('hostels.district_id', $district);
        }

        if (!empty($ward)) {
            $hostels = $hostels->where('hostels.ward_id', $ward);
        }

        if (!empty($price)) {
            if ($price > 7) {
                $hostels = $hostels->where('rooms.price', '>', 15000000);
            } else {
                $priceP = Functions::getPrice($price);
                if (!is_null($priceP['start']) && !is_null($priceP['end'])) {
                    $hostels = $hostels->whereBetween('rooms.price', [$priceP['start'], $priceP['end']]);
                }
            }
        }

        // dd($hostels->toSql());

        if (!empty($size)) {
            if ($size > 8) {
                $hostels = $hostels->where('rooms.size', '>', 100);
            } else {
                $sizeP = Functions::getSize($size);
                if (!empty($sizeP['start']) && !empty($sizeP['end'])) {
                    $hostels = $hostels->whereBetween('rooms.size', [$sizeP['start'], $sizeP['end']]);
                }
            }
        }


        if (!empty($amenities)) {
            $hostelArr = \DB::table('hostel_amenities')->whereIn('amenities_id', $amenities)->groupBy('hostel_id')
                ->havingRaw('COUNT(DISTINCT amenities_id) = ' . count($amenities))->pluck('hostel_id')->toArray();
            $hostels = $hostels->whereIn('hostels.id', $hostelArr);
        }

        // dd($hostels->toSql());

        if (!empty($policies)) {
            $hostelArr = \DB::table('hostel_amenities')->whereIn('amenities_id', $policies)->groupBy('hostel_id')
                ->havingRaw('COUNT(DISTINCT amenities_id) = ' . count($policies))->pluck('hostel_id')->toArray();
            $hostels = $hostels->whereIn('hostels.id', $hostelArr);
        }

        if (!empty($lat) && !empty($lng)) {
            $hostels = $hostels->isWithinMaxDistance([
                'lat' => $lat,
                'lng' => $lng
            ], 15);
        }

        $hostels = $hostels->paginate(9);

        $itemLocation = [];

        foreach ($hostels as $hostel) {
            if (!empty($hostel->lat) && !empty($hostel->lng)) {
                $itemLocation[] = [
                    'lat' => $hostel->lat,
                    'lng' => $hostel->lng,
                    'name' => $hostel->name,
                    //  'content' => $hostel->number_empty_rooms.'/'.$hostel->number_rooms
                    'content' => view('frontend3.item_map', compact('hostel'))->render()
                ];
            }
        }

        if (isset($itemLocation[0])) {
            $center = $itemLocation[0];
        } else {
            $center = [
                'lat' => '21.028511',
                'lng' => '105.804817',
                'name' => 'Location'
            ];
        }

        return response([
            'status' => 1,
            'html' => view('frontend3.items', compact('hostels'))->render(),
            'url' => str_replace('search-attr', 'tim-kiem', $request->fullUrl()),
            'center' => $center,
            'locations' => $itemLocation
        ]);
    }

    public function ownerSearch(Request $request)
    {
        $province = $request->input('province');
        $district = $request->input('district');
        $ward = $request->input('ward');
        $price = $request->input('price');
        $size = $request->input('size');
        $amenities = $request->input('amenities');
        $policies = $request->input('policies');
        $lat = $request->input('lat');
        $lng = $request->input('lng');

        $q = $request->input('q');

        if (!empty($q)) {
            if (empty($lat) || empty($lng)) {
                $coor = Functions::geocode($q);
                $lat = $coor['lat'];
                $lng = $coor['lng'];
            }
        }

        $ownerId = session('owner_id');

        $hostels = Hostel::where('owner_id', $ownerId);

        $hostelsArr = Hostel::where('owner_id', $ownerId);
        if (!empty($lat) && !empty($lng)) {
            $hostels = $hostels->isWithinMaxDistance([
                'lat' => $lat,
                'lng' => $lng
            ]);

            $hostelsArr = $hostelsArr->isWithinMaxDistance([
                'lat' => $lat,
                'lng' => $lng
            ]);
        }

        $hostelsArr = $hostelsArr->pluck('id')->toArray();
        $hostels = $hostels->get();


        $rooms = Room::select('rooms.*')->join('hostels', 'hostels.id', '=', 'rooms.hostel_id')
            ->whereIn('hostel_id', $hostelsArr)
            ->groupBy('rooms.id');


        if (!empty($province)) {
            $rooms = $rooms->where('hostels.province_id', $province);
        }

        if (!empty($district)) {
            $rooms = $rooms->where('hostels.district_id', $district);
        }

        if (!empty($ward)) {
            $rooms = $rooms->where('hostels.ward_id', $ward);
        }

        if (!empty($amenities)) {
            if (!empty($amenities)) {
                $hostelArr = \DB::table('room_amenities')->whereIn('amenity_id', $amenities)->groupBy('room_id')
                    ->havingRaw('COUNT(DISTINCT amenity_id) = ' . count($amenities))->pluck('room_id')->toArray();
                $rooms = $rooms->whereIn('rooms.id', $hostelArr);
            }
        }

        if (!empty($policies)) {
            if (!empty($policies)) {
                $hostelArr = \DB::table('room_amenities')->whereIn('amenity_id', $policies)->groupBy('room_id')
                    ->havingRaw('COUNT(DISTINCT amenity_id) = ' . count($policies))->pluck('room_id')->toArray();
                $rooms = $rooms->whereIn('rooms.id', $hostelArr);
            }
        }

        if (!empty($price)) {
            if ($price > 7) {
                $rooms = $rooms->where('rooms.price', '>', 15000000);
            } else {
                $priceP = Functions::getPrice($price);

                if (!empty($priceP['start']) && !empty($priceP['end'])) {
                    $rooms = $rooms->whereBetween('rooms.price', [$priceP['start'], $priceP['end']]);
                }
            }
        }

        $rooms = $rooms->paginate(9);

        $center = [
            'lat' => '21.028511',
            'lng' => '105.804817',
            'name' => 'Location'
        ];

        if (isset($rooms[0])) {
            $centerHostel = $rooms[0]->hostel;
            if (!empty($centerHostel->lat) && !empty($centerHostel->lng)) {
                $center = [
                    'lat' => $centerHostel->lat,
                    'lng' => $centerHostel->lng,
                    'name' => $centerHostel->name
                ];
            }
        }

        $itemLocation = [];

        foreach ($hostels as $hostel) {
            if (!empty($hostel->lat) && !empty($hostel->lng)) {
                $itemLocation[] = [
                    'lat' => $hostel->lat,
                    'lng' => $hostel->lng,
                    'name' => $hostel->name,
                    'content' => view('frontend3.item_need_more_map', compact('hostel'))->render()
                ];
            }
        }

        return response([
            'status' => 1,
            'html' => view('frontend3.item_owner_searchs', compact('rooms'))->render(),
            //  'url' => str_replace('search-need-more-attr', 'tim-o-ghep', $request->fullUrl()),
            'center' => $center,
            'locations' => $itemLocation
        ]);
    }

    public function ownerSearch2(Request $request)
    {
        $province = $request->input('province_id');
        $district = $request->input('district');
        $prices = $request->input('prices');
        $amenities = $request->input('amenities');
        $ownerId = session('owner_id');
        $sortOrder = $request->input('sort_order');

        $hostels = Hostel::where('owner_id', $ownerId)
            ->where('is_display', true)
            ->where('number_empty_rooms', '>', 0)
            ->with([
                'rooms'
            ]);


        if (!empty($province)) {
            $hostels = $hostels->where('hostels.province_id', $province);
        }

        if (!empty($district)) {

            if (is_array($district)) {
                $hostels = $hostels->whereIn('hostels.district_id', $district);
            }
        }

        if (!empty($amenities)) {
            if (is_array($amenities)) {
                $hostelArr = \DB::table('hostel_amenities')->whereIn('amenities_id', $amenities)->groupBy('hostel_id')
                    ->havingRaw('COUNT(DISTINCT amenities_id) = ' . count($amenities))->pluck('hostel_id')->toArray();
                $hostels = $hostels->whereIn('id', $hostelArr);
            }
        }

        if (!empty($prices)) {
            if (is_array($prices)) {
                $min = min($prices);
                $max = max($prices);

                $priceMin = Functions::getPriceMin($min);
                $priceMax = Functions::getPriceMax($max);

                $hostels = $hostels->whereHas('rooms', function ($q) use ($priceMax, $priceMin) {
                    $q->whereBetween('price', [$priceMin, $priceMax]);
                });


            }
        }

        if ($sortOrder == 1) {
            $hostels = $hostels->orderBy('name', 'asc');
        }

        if ($sortOrder == 2) {
            $hostels = $hostels->orderBy('name', 'desc');
        }

        if ($sortOrder == 3) {
            $hostels = $hostels->orderBy('smallest_price', 'asc');
        }

        if ($sortOrder == 4) {
            $hostels = $hostels->orderBy('smallest_price', 'desc');
        }

        $hostels = $hostels->paginate(10);

        return response([
            'status' => 1,
            'data' => view('frontend3.owner_search.item', compact('hostels'))->render(),
            'filtered' => view('frontend3.owner_search.filter_selected', [
                'numberDistrict' => !empty($district) ? count($district) : 0,
                'numberAmenities' => !empty($amenities) ? count($amenities): 0,
                'numberPrices' => !empty($prices) ? count($prices) : 0,
                'numberProvince' => !empty($province) ? 1: 0
            ])->render(),
            'cnt' => $hostels->total()
        ]);
    }
}
