<?php

namespace App\Http\Controllers\Frontend;

use App\Components\Functions;
use App\Models\Amenity;
use App\Models\Hostel;
use App\Models\RenterRoom;
use App\Models\Room;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class MapNewController extends Controller
{
    //
    public function index(Request $request)
    {
        $provinces = Functions::getProvinces();
        $amenities = cache()->remember('amenities', 1200*60, function () {
            return Amenity::where('type', Amenity::AMENITY)->where('user_id', 0)->get();
        });

        $policies = cache()->remember('policies', 1200*60, function () {
            return Amenity::where('type', Amenity::POLICY)->where('user_id', 0)->get();
        });
        $checkedAmenities = $request->input('amenities');
        $checkedPolicies = $request->input('policies');
        $lat = $request->input('lat');
        $lng = $request->input('lng');
        $address = $request->input('query');
        if (!empty($address)) {
            if (empty($lat) || empty($lng)) {
                $location = Functions::geocode($address);

                if (!empty($location['lat'] && !empty($location['lng']))) {
                    $lat = $location['lat'];
                    $lng = $location['lng'];
                }
            }
        }

        return view('frontend3.map_2.index', compact('provinces', 'amenities', 'policies', 'checkedPolicies', 'checkedAmenities', 'lat', 'lng'));
    }

    public function getHostelByLocation(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');
        $filter = $request->input('filter');
        $radius = $request->input('radius');

        $neLat = $request->input('ne_lat');
        $neLng = $request->input('ne_lng');
        $swLat = $request->input('sw_lat');
        $swLng = $request->input('sw_lng');
        $address = $request->input('address');

        $isEmpty = $request->input('ie');


        $items = Hostel::display();

        if ($isEmpty == 1) {
            $items = $items->where('number_empty_rooms', '>', 0);
        }

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

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

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

        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();
            $items = $items->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();
            $items = $items->whereIn('hostels.id', $hostelArr);
        }

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


        $items = $items->whereBetween('lat', [$swLat, $neLat])->whereBetween('lng', [$swLng, $neLng])->get();


        $itemLocation = [];
        foreach ($items as $item) {
            if (!empty($item->lat) && !empty($item->lng)) {

                $numbers = \App\Components\Functions::getNumberRoomsHostel($item);

                //  $label = $numbers['number_empty_rooms'] . '/' . $numbers['number_rooms'];
                $label = $numbers['number_empty_rooms'];
                $itemLocation[] = [
                    'lat' => $item->lat,
                    'lng' => $item->lng,
                    'name' => $item->name,
                    'content' => view('frontend3.item_map', [
                        'hostel' => $item
                    ])->render(),
                    'label' => strval($label)
                ];
            }
        }


        return response([
            'lat' => $lat,
            'lng' => $lng,
            'locations' => $itemLocation,
            'html' => view('frontend3.map_2.item', [
                'hostels' => $items
            ])->render(),
        ]);
    }

    public function getRoomByLocation(Request $request)
    {
        $this->setLocation();


        // ->leftJoin('rooms', 'hostels.id', '=', 'rooms.hostel_id')->groupBy('hostels.id')
        $items = Hostel::where('hostels.number_empty_rooms', '>', 0)->display()
            ->orderBy('hostels.id', 'desc');

        $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');
        $filter = $request->input('filter');
        $radius = $request->input('radius');

        if (!empty($lat) && !empty($lng)) {
            $items = $items->isWithinMaxDistance([
                'lat' => $lat,
                'lng' => $lng,

            ]);
        } else {

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

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

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

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

        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();
            $items = $items->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();
            $items = $items->whereIn('hostels.id', $hostelArr);
        }

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

        $locations = [];

        $items = $items->paginate(30);
        $centerLat = null;
        $centerLng = null;

        if (!empty($filter)) {
            if (isset($locations[0])) {
                $centerLat = $locations[0]['lat'];
                $centerLng = $locations[0]['lng'];
            }
        }

        return response([
            'status' => 1,
            'lat' => empty($lat) ? '21.0333' : $lat,
            'lng' => empty($lng) ? '105.8500' : $lng,
            'center_lat' => $centerLat,
            'center_lng' => $centerLng,
            'html' => view('frontend3.map_2.item', [
                'hostels' => $items
            ])->render(),
            'locations' => $locations
        ]);
    }

    public function setLocation()
    {
        $request = request();

        $lat = $request->input('current_lat');
        $lng = $request->input('current_lng');

        if (!empty($lat) && !empty($lng)) {
            setcookie('lat', $lat, time() + (86400 * 30), "/"); // 86400 = 1 day
            setcookie('lng', $lng, time() + (86400 * 30), "/"); // 86400 = 1 day

        } else {

            if (!isset($_COOKIE['lat']) || !isset($_COOKIE['lng'])) {
                $ip = $request->ip();
                $geoApiUrl = 'http://ip-api.com/json/' . $ip;
                $json = file_get_contents($geoApiUrl);
                $geoApiData = json_decode($json, true);
                if (isset($geoApiData['lat'])) {
                    setcookie('lat', $geoApiData['lat'], time() + (86400 * 30), "/"); // 86400 = 1 day
                }

                if (isset($geoApiData['lat'])) {
                    setcookie('lng', $geoApiData['lon'], time() + (86400 * 30), "/"); // 86400 = 1 day
                }

            }
        }
    }
}
