<?php

namespace App\Http\Controllers\Frontend;

use App\Components\Functions;
use App\Http\Requests\StepRequest;
use App\Models\Amenity;
use App\Models\Notification;
use App\Models\Room;
use App\Models\RoomNeedMore;
use App\User;
use Carbon\Carbon;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class RoomController extends Controller
{
    //
    public function index(Request $request)
    {
        if (!auth('backend')->check()) {
            return redirect()->to(url('/'))->with('error', 'Bạn chưa đăng nhập');
        }

        if(auth('backend')->user()->type != User::ADMIN) {

            $whitelistArr = ['0986255558', '0982140996', '0986174174', '0979293300', '0962131188'];

            if(!in_array(auth('backend')->user()->phone, $whitelistArr)) {
                $startOfWeek = Carbon::now()->startOfWeek()->toDateTimeString();
                $endOfWeek = Carbon::now()->endOfWeek()->toDateTimeString();

                $check = RoomNeedMore::where('user_id', auth('backend')->user()->id)
                    ->whereBetween('created_at', [$startOfWeek, $endOfWeek])
                    ->count();

                if ($check > 0) {
                    return redirect()->to(url('/'))->with('error', 'Bạn chỉ được đăng tin tìm ở ghép 1 tuần 1 lần');
                }
            }
        }

        if (!session()->has('step')) {
            session()->put('step', 1);
        }

        if (cache()->has('images-dt-' . session()->getId())) {
            //dd(cache()->get( 'images-dt-' . session()->getId() ));
            $step = session()->get('step');
            if ($step == 5) {
                $step = 6;
                session()->put('step', $step);
            }
        }

        return view('frontend3.steps.layout');
    }

    public function step1(Request $request)
    {
        $data = $request->all();

        session()->forget('step');
        session()->put('step', 2);
        session()->put('data', $data);

        return redirect()->to(url('tim-ban'));

    }

    public function step2(Request $request)
    {
        $data = $request->all();

        session()->forget('step');
        session()->put('step', 3);
        session()->put('data', $data);

        return redirect()->to(url('tim-ban'));

    }

    public function step3(Request $request)
    {
        $data = $request->all();

        session()->forget('step');
        session()->put('step', 4);
        session()->put('data', $data);

        return redirect()->to(url('tim-ban'));

    }

    public function step4(Request $request)
    {
        $data = $request->all();

        //$images = $request->file( 'images' );

//		$imageArr = [];
//		if ( cache()->has( 'images-dt-' . session()->getId() ) ) {
//			$imageArr = cache()->get( 'images-dt-' . session()->getId() );
//		}
//		if ( is_array( $images ) ) {
//			foreach ( $images as $image ) {
//				$item       = Functions::uploadImage( $image );
//				$imageArr[] = $item;
//			}
//		}

        session()->forget('step');
        session()->put('step', 5);
        session()->put('data', $data);
        //session()->put( 'images', $imageArr );
        //cache()->put( 'images-dt-' . session()->getId(), $imageArr, 120 );

        return redirect()->to(url('tim-ban'));

    }

    public function step5(Request $request)
    {
        $data = $request->all();

        $images = $request->file('images');

//        $imageArr = [];
//
//        if (cache()->has('images-dt-' . session()->getId())) {
//            $imageArr = cache()->get('images-dt-' . session()->getId());
//        }
//
//        if (is_array($images)) {
//            foreach ($images as $image) {
//                $item = Functions::uploadImage($image);
//                $imageArr[] = $item;
//            }
//        }

        session()->forget('step');
        session()->put('step', 6);
        session()->put('data', $data);
        //session()->put('images', $imageArr);
     //   cache()->put('images-dt-' . session()->getId(), $imageArr, 120);//dump(session()->get('step'));

        //dd(session()->get('step'));

        return redirect()->to(url('tim-ban'));

    }

    public function step6(Request $request)
    {
        $data = $request->except(['amenities', 'policies']);

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

        $images = $request->file('images');

        $imageArr = [];

        if (cache()->has('images-dt-' . session()->getId())) {
            $imageArr = cache()->get('images-dt-' . session()->getId());
        }

//        if (is_array($images)) {
//            foreach ($images as $image) {
//                $item = Functions::uploadImage($image);
//                $imageArr[] = $item;
//            }
//        }


        $address = $data['address'];

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

        $data2 = $data;
        $data2['amenities'] = $amenities;
        $data2['policies'] = $policies;

        session()->forget('step');
        session()->put('step', 7);
        session()->put('data', $data2);
        session()->put('images-dt', $imageArr);
        cache()->put('images-dt-' . session()->getId(), $imageArr, 120*60);


        $validatedData = $this->validate($request, [
            'gender' => 'required',
            'number_peoples' => 'required|min:1',
            'province' => 'required',
            'district' => 'required',
            'ward' => 'required',
            'address' => 'required',
            'date_available' => 'required',
            'age' => 'required',
            'price' => 'required|numeric|min:1',
            'size' => 'required|numeric|min:1',
            'desc' => 'required|string|min:100',
        ], [
            'gender.required' => 'Không được bỏ trống giới tính',
            'number_peoples.required' => 'Không được bỏ trống số người',
            'age.required' => 'Không được bỏ trống tuổi',
            'province.required' => 'Không được bỏ trống tỉnh / thành phố',
            'address.required' => 'Không được bỏ trống địa chỉ',
            'district.required' => 'Không được bỏ trống quận / huyện',
            'ward.required' => 'Không được bỏ trống phường xã',
            'date_available.required' => 'Không được bỏ trống ngày chuyển đến',
            'price.required' => 'Không được bỏ trống giá',
            'price.min' => 'Giá phải lớn hơn 0',
            'price.numeric' => 'Giá phải là số',
            'size.required' => 'Không được bỏ trống diện tích',
            'size.min' => 'Diện tích phải lớn hơn 0',
            'size.numeric' => 'Diện tích phải là số',
            'desc.required' => 'Không được bỏ trống miêu tả',
            'desc.min' => 'Mô tả phải nhiều hơn 100 ký tự',
            'desc.string' => 'Mô tả phải là chuỗi ký tự',
        ]);

        if($data['price'] <= 0)
        {
            return redirect()->back()->with('error', 'Giá phải lớn hơn 0');
        }

        if($data['size'] <= 0)
        {
            return redirect()->back()->with('error', 'Diện tích phải lớn hơn 0');
        }

        $data['images'] = json_encode($imageArr);

        if (isset($imageArr[0])) {
            $data['image'] = $imageArr[0];
        }

        if (isset($data['age'])) {
            $data['age'] = json_encode($data['age']);
        }

        if (count($imageArr) == 0) {
            return redirect()->to(url('tim-ban'))->with('error', 'Bạn phải chọn ít nhất một ảnh');
        }

        if (isset($data['date_available'])) {
            try {
                $data['date_available'] = Carbon::createFromFormat('d/m/Y', $data['date_available'])->toDateString();
            } catch (\Exception $exception) {
                $data['date_available'] = null;
            }
        }


        try {

            \DB::beginTransaction();

            if ($data['gender'] != 'Khác') {

                $data['name'] = 'Tìm ' . $data['number_peoples'] . ' '. strtolower($data['gender']);
            } else {
                $data['name'] = 'Tìm ' . $data['number_peoples'] . ' ';
            }

            if(isset($data['district']))
            {
                $districtdt = Functions::getDistrictName($data['district']);
                if($districtdt)
                {
                    $data['name'] .= ' ở ghép tại '.$districtdt->name;
                }
            }

            $data['user_id'] = auth('backend')->user()->id;



            $item = RoomNeedMore::create($data);

            if (isset($amenities)) {
                if (is_array($amenities)) {
                    \DB::table('room_need_more_amenities')->where('room_id', $item->id)->where('type', Amenity::AMENITY)->delete();
                    foreach ($amenities as $feature) {
                        \DB::table('room_need_more_amenities')->insert([
                            'room_id' => $item->id,
                            'amenities_id' => $feature,
                            'type' => Amenity::AMENITY,
                            'created_at' => Carbon::now()->toDateTimeString(),
                            'updated_at' => Carbon::now()->toDateTimeString()
                        ]);
                    }
                }
            }

            if (isset($policies)) {
                if (is_array($policies)) {
                    \DB::table('room_need_more_amenities')->where('room_id', $item->id)->where('type', Amenity::POLICY)->delete();
                    foreach ($policies as $policy) {
                        \DB::table('room_need_more_amenities')->insert([
                            'room_id' => $item->id,
                            'amenities_id' => $policy,
                            'type' => Amenity::POLICY,
                            'created_at' => Carbon::now()->toDateTimeString(),
                            'updated_at' => Carbon::now()->toDateTimeString()
                        ]);
                    }
                }
            }

            session()->forget('step');
            session()->forget('data');
            session()->forget('images-dt');
            cache()->forget('images-dt-' . session()->getId());

            $payload = json_encode([
                'id' => $item->id,
                'type' => config('constants.ROOM_NEED_MORE')
            ]);

            Notification::create([
                'to_user' => auth('backend')->user()->id,
                'title' => 'Thông báo từ itro.vn',
                'user_id' => auth('backend')->user()->id,
                'content' => 'Bạn đã tạo thành công tin đăng tìm bạn ở ghép. Hãy chia sẻ ngay lên facebook (tường nhà, page) để tăng khả năng tìm kiếm bạn cùng phòng phù hợp',
                'payload' => $payload,
            ]);

            \DB::commit();
        } catch (\Exception $exception) {
            \DB::rollBack();

            dd($exception->getMessage() . '|' . $exception->getLine());
        }

        return redirect()->to(url('phong-ghep/'.str_slug($item->name).'-'.$item->id))->with('success', 'Đăng thành công');

       // return redirect()->to(url('tim-ban'))->with('success', 'Đăng thành công');

    }

    public function update($id)
    {
        if (!auth('backend')->check()) {
            return redirect()->to(url('/'))->with('error', 'Bạn phải đăng nhập trước');
        }

        $room = RoomNeedMore::find($id);

        if (!$room) {
            return redirect()->to(url('/'))->with('error', 'Dữ liệu không hợp lệ');
        }


        return view('frontend3.steps.update', compact('room'));

    }

    public function edit($id, Request $request)
    {

        if (!auth('backend')->check()) {
            return redirect()->to(url('/'))->with('error', 'Bạn phải đăng nhập trước');
        }

        $item = RoomNeedMore::find($id);

        if (!$item) {
            return redirect()->to(url('/'))->with('error', 'Dữ liệu không hợp lệ');
        }

        $data = $request->except(['amenities', 'policies']);

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

//        $images = $request->file('images');
//
//        $imageArr = json_decode($item->images, true);
//
//        if (is_array($images)) {
//            foreach ($images as $image) {
//                $itemImage = Functions::uploadImage($image);
//                $imageArr[] = $itemImage;
//            }
//        }
        //$data['images'] = json_encode($imageArr);

        $address = $data['address'];

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

        $imageArr = json_decode($item->images, true);

        if(is_array($imageArr)) {
            if (isset($imageArr[0])) {
                $data['image'] = $imageArr[0];
            }
        }

        if (isset($data['age'])) {
            $data['age'] = json_encode($data['age']);
        }

        if (count($imageArr) == 0) {
            return redirect()->back()->with('error', 'Bạn phải chọn ít nhất một ảnh');
        }

        if (isset($data['date_available'])) {
            try {
                $data['date_available'] = Carbon::createFromFormat('d/m/Y', $data['date_available'])->toDateString();
            } catch (\Exception $exception) {
                $data['date_available'] = null;
            }
        }


        try {

            \DB::beginTransaction();

            if ($data['gender'] != 'Khác') {

                $data['name'] = 'Tìm ' . $data['number_peoples'] . ' bạn ' . strtolower($data['gender']);
            } else {
                $data['name'] = 'Tìm ' . $data['number_peoples'] . ' bạn';
            }

            $age = json_decode($data['age'], true);

            if (!is_array($age)) {

                if ($data['age'] == RoomNeedMore::UNDER_20) {
                    $data['name'] .= ' dưới 20 tuổi';
                } else if ($data['age'] == RoomNeedMore::FROM_20_TO_30) {
                    $data['name'] .= ' từ 20 - 30 tuổi';
                } else if ($data['age'] == RoomNeedMore::OVER_30) {
                    $data['name'] .= ' trên 30 tuổi';
                }
            } else {


                if (in_array(RoomNeedMore::FROM_20_TO_30, $age) && in_array(RoomNeedMore::UNDER_20, $age) && in_array(RoomNeedMore::OVER_30, $age)) {
                    $data['name'] .= ' trên 18 tuổi';
                } else if (in_array(RoomNeedMore::FROM_20_TO_30, $age) && in_array(RoomNeedMore::UNDER_20, $age)) {
                    $data['name'] .= ' dưới 20 tuổi';
                } else if (in_array(RoomNeedMore::FROM_20_TO_30, $age) && in_array(RoomNeedMore::OVER_30, $age)) {
                    $data['name'] .= ' trên 30 tuổi';
                } else if (in_array(RoomNeedMore::UNDER_20, $age) && in_array(RoomNeedMore::OVER_30, $age)) {
                    $data['name'] .= ' trên 18 tuổi';
                } else if (in_array(RoomNeedMore::UNDER_20, $age)) {
                    $data['name'] .= ' dưới 20 tuổi';
                } else if (in_array(RoomNeedMore::OVER_30, $age)) {
                    $data['name'] .= ' trên 30 tuổi';
                } else if (in_array(RoomNeedMore::FROM_20_TO_30, $age)) {
                    $data['name'] .= ' từ 20 đến 30 tuổi';
                }

            }
            $data['user_id'] = auth('backend')->user()->id;

            $item->update($data);

            if (isset($amenities)) {
                if (is_array($amenities)) {
                    \DB::table('room_need_more_amenities')->where('room_id', $item->id)->where('type', Amenity::AMENITY)->delete();
                    foreach ($amenities as $feature) {
                        \DB::table('room_need_more_amenities')->insert([
                            'room_id' => $item->id,
                            'amenities_id' => $feature,
                            'type' => Amenity::AMENITY,
                            'created_at' => Carbon::now()->toDateTimeString(),
                            'updated_at' => Carbon::now()->toDateTimeString()
                        ]);
                    }
                }
            }

            if (isset($policies)) {
                if (is_array($policies)) {
                    \DB::table('room_need_more_amenities')->where('room_id', $item->id)->where('type', Amenity::POLICY)->delete();
                    foreach ($policies as $policy) {
                        \DB::table('room_need_more_amenities')->insert([
                            'room_id' => $item->id,
                            'amenities_id' => $policy,
                            'type' => Amenity::POLICY,
                            'created_at' => Carbon::now()->toDateTimeString(),
                            'updated_at' => Carbon::now()->toDateTimeString()
                        ]);
                    }
                }
            }

            \DB::commit();
        } catch (\Exception $exception) {
            \DB::rollBack();

            dd($exception->getMessage() . '|' . $exception->getLine());
        }

        //return redirect()->back()->with('success', 'Cập nhật thành công');

        return redirect()->to(url('phong-ghep/'.str_slug($item->name).'-'.$item->id))->with('success', 'Cập nhật thành công');
    }

    public function updateImages(Request $request)
    {
        $images = $request->input('images');
        $roomId = $request->input('room_id');

        $room = RoomNeedMore::find($roomId);

        if (!$room) {
            return response([
                'status' => 0,
                'message' => ''
            ]);
        }

        if (is_array($images)) {

            $data = json_encode($images);
            $room->images = $data;
            $room->save();
        }

        return response([
            'status' => 1,
            'message' => 'Thành công',
            'html' => view('frontend3.steps.images', compact('images'))->render()
        ]);
    }

    public function deleteImage(Request $request)
    {
        $image = $request->input('image');
        $roomId = $request->input('room_id');

        $room = RoomNeedMore::find($roomId);

        if (!$room) {
            return response([
                'status' => 0,
                'message' => ''
            ]);
        }

        $images = $room->images;
        if(!empty($images))
        {
            $images = json_decode($images, true);

            if (($key = array_search($image, $images)) !== false) {
                unset($images[$key]);
            }

            $room->images = json_encode($images);
            $room->save();

        }

        return response([
            'status' => 1,
            'message' => 'Thành công',
            'html' => view('frontend3.steps.images', compact('images'))->render()
        ]);
    }

    public function updateImagesUpload(Request $request)
    {
        $image = $request->input('image');

        if (session()->has('images')) {
            $imageArrSession = session()->get('images');

            if (($key = array_search($image, $imageArrSession)) !== false) {
                unset($imageArrSession[$key]);
            }
            session()->put('images', $imageArrSession);
        }

        if (cache()->has('images-dt-' . session()->getId())) {
            $imageArrCache = cache()->get('images-dt-' . session()->getId());
            if (($key = array_search($image, $imageArrCache)) !== false) {
                unset($imageArrCache[$key]);
            }
            cache()->put('images-dt-' . session()->getId(), $imageArrCache, 120*60);
        }

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

    public function uploadImageCreate(Request $request)
    {
        $image = null;
        if ($request->file('image') && $request->file('image')->isValid()) {
            $image = Functions::uploadImage($request->file('image'));
        }

        if (!empty($image)) {

            if (session()->has('images')) {
                $imageArrSession = session()->get('images');
            } else {
                $imageArrSession = [];
            }
            $imageArrSession[] = $image;
            session()->put('images', $imageArrSession);

            if (cache()->has('images-dt-' . session()->getId())) {
                $imageArrCache = cache()->get('images-dt-' . session()->getId());

            } else {
                $imageArrCache = [];

            }
            $imageArrCache[] = $image;
            cache()->put('images-dt-' . session()->getId(), $imageArrCache, 120);
        }


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

    public function uploadImageUpdate(Request $request)
    {
        $roomId = $request->input('room_id');
        $image = null;

        if(!empty($roomId))
        {
            $room = RoomNeedMore::find($roomId);
            if($room)
            {
                if ($request->file('image') && $request->file('image')->isValid()) {
                    $image = Functions::uploadImage($request->file('image'));
                }

                if (!empty($image)) {

                    $imgArr = [];

                    if(!empty($room->images))
                    {
                        $imgArr = json_decode($room->images, true);
                    }

                    $imgArr[] = $image;
                    $room->images = json_encode($imgArr);
                    $room->save();
                }
            }
        }
        return response([
            'status' => 1,
            'message' => 'Thành công',
            'result' => $image
        ]);
    }
}
