<?php

namespace App\Http\Controllers\Frontend;

use App\Models\Amenity;
use App\Models\Config;
use App\Models\Hostel;
use App\Models\HostelPostCrawl;
use App\Models\HostelRating;
use App\Models\RenterRoom;
use App\Models\Room;
use App\Models\RoomNeedMore;
use App\Models\RoomType;
use App\Models\Wishlist;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class HostelController extends Controller
{
    //
    public function detail($slug, $id, Request $request)
    {
        $hostel = Hostel::find($id);
        if ($hostel) {

            $rooms = Room::where('hostel_id', $id)->pluck('type')->toArray();
            $roomTypes = RoomType::whereIn('id', $rooms)->get();
            $amenities = \DB::table('hostel_amenities')->join('amenities', 'hostel_amenities.amenities_id', '=', 'amenities.id')
                ->where('amenities.type', Amenity::AMENITY)
                ->where('hostel_amenities.hostel_id', $id)->get();

            $policies = \DB::table('hostel_amenities')->join('amenities', 'hostel_amenities.amenities_id', '=', 'amenities.id')
                ->where('amenities.type', Amenity::POLICY)
                ->where('hostel_amenities.hostel_id', $id)->get();

            $usedRoom = RenterRoom::where('hostel_id', $hostel->id)
                ->pluck('room_id')->toArray();

            $emptyRooms = Room::where('hostel_id', $hostel->id)
                ->whereNotIn('id', $usedRoom)
                ->get();

            $relates = null;

            if (!empty($hostel->lat) && !empty($hostel->lng)) {
                $relates = Hostel::isWithinMaxDistance([
                    'lat' => $hostel->lat,
                    'lng' => $hostel->lng
                ])->where('id', '<>', $hostel->id)->orderBy('id', 'desc')->take(4)->get();
            }


            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;
                        }
                    }

                    $relates = Hostel::where('id', '<>', $hostel->id)
                        ->where('is_display', true)
                        ->where('number_empty_rooms', '>', 0)
                        ->where('owner_id', session('owner_id'))
                        ->orderBy('id', 'desc')->take(10)->get();

                    return view('frontend3.hostel_owner', compact('hostel', 'roomTypes', 'amenities', 'policies', 'emptyRooms', 'relates', 'logo'));
                }
            }
            // return view('frontend.hostel', compact('hostel', 'roomTypes', 'amenities'));

            return view('frontend3.hostel', compact('hostel', 'roomTypes', 'amenities', 'policies', 'emptyRooms', 'relates'));
        }

        return redirect()->back()->with('error', 'Dữ liệu không hợp lệ');
    }

    public function detailPostCrawl($slug, $id, Request $request)
    {
        $hostel = HostelPostCrawl::find($id);
        if ($hostel) {
            $amenities = null;
            $policies = null;

            if ($hostel->hostel) {
                $amenities = \DB::table('hostel_amenities')->join('amenities', 'hostel_amenities.amenities_id', '=', 'amenities.id')
                    ->where('amenities.type', Amenity::AMENITY)
                    ->where('hostel_amenities.hostel_id', $hostel->hostel->id)->get();

                $policies = \DB::table('hostel_amenities')->join('amenities', 'hostel_amenities.amenities_id', '=', 'amenities.id')
                    ->where('amenities.type', Amenity::POLICY)
                    ->where('hostel_amenities.hostel_id', $hostel->hostel->id)->get();
            }

            $relates = null;
            return view('frontend3.hostel_post_crawl', compact('hostel', 'relates', 'policies', 'amenities'));
        }
        return redirect()->back()->with('error', 'Dữ liệu không hợp lệ');
    }

    public function detailRoom($slug, $id)
    {
        $room = RoomNeedMore::find($id);
        if ($room) {
            $amenities = \DB::table('room_need_more_amenities')->join('amenities', 'room_need_more_amenities.amenities_id', '=', 'amenities.id')
                ->where('amenities.type', Amenity::AMENITY)
                ->where('room_need_more_amenities.room_id', $id)->get();

            $policies = \DB::table('room_need_more_amenities')->join('amenities', 'room_need_more_amenities.amenities_id', '=', 'amenities.id')
                ->where('amenities.type', Amenity::POLICY)
                ->where('room_need_more_amenities.room_id', $id)->get();


            $relates = null;

            if (!empty($room->lat) && !empty($room->lng)) {
                $relates = RoomNeedMore::isWithinMaxDistance([
                    'lat' => $room->lat,
                    'lng' => $room->lng
                ])->where('id', '<>', $room->id)->orderBy('id', 'desc')->take(4)->get();
            }


            // return view('frontend.hostel', compact('hostel', 'roomTypes', 'amenities'));

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

        return redirect()->back()->with('error', 'Dữ liệu không hợp lệ');
    }

    public function getRatings(Request $request)
    {
        $hostelId = $request->input('hostel_id');

        $ratings = HostelRating::where('hostel_id', $hostelId)->paginate(5);

        return response([
            'status' => 1,
            'html' => view('frontend.hostel.ratings', compact('ratings'))->render()
        ]);
    }

    public function createRating(Request $request)
    {
        $data = $request->all();
        HostelRating::create($data);

        if ($request->ajax()) {
            return response([
                'status' => 1,
                'message' => 'Thành công'
            ]);
        }

        return redirect()->back()->with('success', 'Thành công');
    }

    public function getPlacesNearby(Request $request)
    {
        $lat = $request->input('lat');
        $lng = $request->input('lng');
        $radius = $request->input('radius', 1);
        $type = $request->input('type');

        if (empty($radius)) {
            $radius = 1;
        }
        $radius *= 1000;

        // $radius = 1000;

        $url = 'https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=' . $lat . ',' . $lng .
            '&radius=' . $radius . '&type=' . $type . '&key=AIzaSyC5_oqCsJvZdLWEadt934vSKipvwhIDFNY';

        $json = file_get_contents($url);

        $data = json_decode($json, true);

        $results = $data['results'];

        $returnArr = [];

        foreach ($results as $result) {

            $lat = $result['geometry']['location']['lat'];
            $lng = $result['geometry']['location']['lng'];
            $address = $result['vicinity'];
            $name = $result['name'];

            $itemArr = ['lat' => $lat, 'lng' => $lng, 'name' => $name, 'address' => $address];

            $returnArr[] = $itemArr;

        }

        return response([
            'status' => 1,
            'data' => $returnArr,
            'html' => view('frontend3.places', [
                'places' => $returnArr
            ])->render()
        ]);

    }

    public function removeWishlist(Request $request)
    {
        if (!auth('backend')->check()) {
            return response([
                'status' => 3,
                'message' => 'Bạn phải đăng nhập'
            ]);
        }

        $userId = auth('backend')->user()->id;
        $hostelId = $request->input('hostel_id');

        Wishlist::where('user_id', $userId)
            ->where('hostel_id', $hostelId)
            ->delete();

        return response([
            'status' => 1,
            'message' => 'Xóa thành công'
        ]);

    }

    public function addWishlist(Request $request)
    {
        if (!auth('backend')->check()) {
            return response([
                'status' => 3,
                'message' => 'Bạn phải đăng nhập'
            ]);
        }
        $userId = auth('backend')->user()->id;
        $hostelId = $request->input('hostel_id');

        $data = false;

        $cnt = Wishlist::where('user_id', $userId)
            ->where('hostel_id', $hostelId)->count();

        if ($cnt == 0) {

            Wishlist::create([
                'user_id' => $userId,
                'hostel_id' => $hostelId
            ]);

            $data = true;
        } else {
            Wishlist::where('user_id', $userId)
                ->where('hostel_id', $hostelId)->delete();
        }

        return response([
            'status' => 1,
            'message' => 'Thành công',
            'data' => $data
        ]);
    }

    public function getWishlist(Request $request)
    {
        if (!auth('backend')->check()) {
            return redirect()->back()->with('error', 'Bạn chưa đăng nhập');
        }

        $userId = auth('backend')->user()->id;

        $items = Hostel::select(\DB::raw('hostels.*'))->join('wishlists', 'hostels.id', '=', 'wishlists.hostel_id')
            ->where('wishlists.user_id', $userId)
            ->get();

        if ($items->count() > 0) {
            if ($request->ajax()) {
                return response([
                    'status' => 1,
                    'html' => view('frontend3.items_wishlist', compact('items'))->render()
                ]);

            }

            return view('frontend3.wishlist', compact('items'));
        }

        if ($request->ajax()) {
            return response([
                'status' => 1,
                'html' => view('frontend3.empty_ajax')->render()
            ]);
        }

        return view('frontend3.wishlist_empty');
    }

    public function getImagesRoomType(Request $request)
    {
        $type = $request->input('type');
        $roomType = RoomType::find($type);
        $images = [];
        if ($roomType) {
            $images = json_decode($roomType->images, true);
        }

        return view('frontend3.fancy_images', compact('images'))->render();
    }


}
