<?php

namespace App\Http\Controllers\Backend;

use App\Components\Functions;
use App\Models\Amenity;
use App\Models\Hostel;
use App\Models\HostelFee;
use App\Models\HostelType;
use App\Models\Room;
use App\Models\RoomFee;
use App\Models\RoomType;
use App\Models\Testimonial;
use App\User;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Predis\Replication\RoleException;
use Yajra\Datatables\Datatables;

class SettingController extends AdminController
{
    //
    public function getAmenitiesByAttributeView()
    {
        return view('admin.setting.amenities');
    }

	public function getTestimonialByAttributeView()
	{
		return view('admin.setting.testimonials');
	}

    public function getHostelTypeByAttributeView()
    {
        return view('admin.setting.hostel_type');
    }

    public function getRoomTypeByAttributeView()
    {
        return view('admin.setting.room_type');
    }

    public function redeemCoupon(Request $request)
    {
    	return view('admin.setting.coupon');
    }

    public function getAmenitiesByAttribute(Request $request)
    {
        $items = Amenity::where('user_id', 0);

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

        if(!empty($type))
        {
            $items = $items->where('type', $type);
        }

        return Datatables::of($items)->editColumn('name', function ($item) {
            return '<a href="javascript:;" data-type="text" 
                data-pk="' . $item->id . '" data-url="' . url('admin/setting/amenities/update-inline', ['id' => $item->id]) . '" 
                data-id="' . $item->id . '" 
                data-name="name"
                class="editable editable-click"> ' . $item->name . ' </a>';
        })->editColumn('web_image', function ($item) {
            return $item->web_image_text;
        })->editColumn('mobile_image', function ($item) {
            return $item->mobile_image_text;
        })->editColumn('icon', function ($item) {
            return '<a href="javascript:;" data-type="text" 
                data-pk="' . $item->id . '" data-url="' . url('admin/setting/amenities/update-inline', ['id' => $item->id]) . '" 
                data-id="' . $item->id . '" 
                data-name="icon"
                class="editable editable-click"> ' . $item->icon . ' </a>';
        })->editColumn('status', function ($item) {

            return $item->status_text;

        })
            ->addColumn('action', function ($item) {
                return
                    '<a href="#update" data-toggle="modal" data-id="' . $item->id . '" class="btn btn-sm green btn-outline update"> Sửa</a>' .
                    '<a href="' . url('admin/setting/amenities/delete', ['id' => $item->id]) . '" class="btn btn-sm red btn-outline delete-btn"> Xóa</a>';


            })->make(true);
    }

	public function getTestimonialByAttribute(Request $request)
	{
		$items = Testimonial::query();

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

		if(!empty($type))
		{
			$items = $items->where('type', $type);
		}

		return Datatables::of($items)->editColumn('name', function ($item) {
			return '<a href="javascript:;" data-type="text" 
                data-pk="' . $item->id . '" data-url="' . url('admin/setting/testimonial/update-inline', ['id' => $item->id]) . '" 
                data-id="' . $item->id . '" 
                data-name="name"
                class="editable editable-click"> ' . $item->name . ' </a>';
		})->editColumn('image', function ($item) {
			return $item->image_text;
		})->editColumn('mobile_image', function ($item) {
			return $item->mobile_image_text;
		})->editColumn('content', function ($item) {
			return '<a href="javascript:;" data-type="text" 
                data-pk="' . $item->id . '" data-url="' . url('admin/setting/testimonial/update-inline', ['id' => $item->id]) . '" 
                data-id="' . $item->id . '" 
                data-name="content"
                class="editable editable-click"> ' . $item->content . ' </a>';
		})->editColumn('address', function ($item) {
			return '<a href="javascript:;" data-type="text" 
                data-pk="' . $item->id . '" data-url="' . url('admin/setting/testimonial/update-inline', ['id' => $item->id]) . '" 
                data-id="' . $item->id . '" 
                data-name="address"
                class="editable editable-click"> ' . $item->address . ' </a>';
		})->editColumn('status', function ($item) {

			return $item->status_text;

		})
		                 ->addColumn('action', function ($item) {
			                 return
				                 '<a href="#update" data-toggle="modal" data-id="' . $item->id . '" class="btn btn-sm green btn-outline update"> Sửa</a>' .
				                 '<a href="' . url('admin/setting/testimonial/delete', ['id' => $item->id]) . '" class="btn btn-sm red btn-outline delete-btn"> Xóa</a>';


		                 })->make(true);
	}


    public function getHostelTypeByAttribute()
    {
        $items = HostelType::all();

        return Datatables::of($items)->editColumn('name', function ($item) {
            return '<a href="javascript:;" data-type="text" 
                data-pk="' . $item->id . '" data-url="' . url('admin/setting/hostel-type/update-inline', ['id' => $item->id]) . '" 
                data-id="' . $item->id . '" 
                data-name="name"
                class="editable editable-click"> ' . $item->name . ' </a>';
        })
            ->addColumn('action', function ($item) {
                return

                    '<a href="' . url('admin/setting/hostel-type/delete', ['id' => $item->id]) . '" class="btn btn-sm red btn-outline delete-btn"> Xóa</a>';

            })->make(true);
    }

    public function getRoomTypeByAttribute()
    {
        $items = RoomType::orderBy('id', 'desc');

        if (auth('backend')->check()) {
            if (auth('backend')->user()->type == User::OWNER) {
                $items = $items->where('owner_id', auth('backend')->user()->id);
            }
        }

        return Datatables::of($items)->editColumn('name', function ($item) {
            return '<a href="javascript:;" data-type="text" 
                data-pk="' . $item->id . '" data-url="' . url('admin/setting/room-type/update-inline', ['id' => $item->id]) . '" 
                data-id="' . $item->id . '" 
                data-name="name"
                class="editable editable-click"> ' . $item->name . ' </a>';
        })
            ->addColumn('action', function ($item) {
                return
                    '<a href="' . url('admin/setting/room-type/edit', ['id' => $item->id]) . '" data-id="' . $item->id . '" class="btn btn-sm green btn-outline update"> Sửa</a>' .
                    '<a href="' . url('admin/setting/room-type/delete', ['id' => $item->id]) . '" class="btn btn-sm red btn-outline delete-btn"> Xóa</a>';

            })->make(true);
    }

    public function storeAmenity(Request $request)
    {
        $data = $request->all();
        $data['status'] = Amenity::ACTIVE;

        if ($request->file('web_image') && $request->file('web_image')->isValid()) {
            $data['web_image'] = Functions::uploadFile($request->file('web_image'));
        }

        if ($request->file('mobile_image') && $request->file('mobile_image')->isValid()) {
            $data['mobile_image'] = Functions::uploadFile($request->file('mobile_image'));
        }

        $data['user_id'] = 0;

        Amenity::create($data);

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

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

	public function storeTestimonial(Request $request)
	{
		$data = $request->all();
		$data['status'] = Testimonial::ACTIVE;

		if ($request->file('image') && $request->file('image')->isValid()) {
			$data['image'] = Functions::uploadFile($request->file('image'));
		}

		Testimonial::create($data);

		cache()->forget('testimonials');

		cache()->rememberForever('testimonials', function() {
			return Testimonial::publish()->get();
		});

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

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

    public function editRoomType($id)
    {
        $item = RoomType::find($id);
        if (!$item) {
            return redirect()->back()->with('error', 'Dữ liệu không hợp lệ');
        }

        return view('admin.setting.edit_room_type', compact('item'));
    }

    public function updateRoomType($id, Request $request)
    {
        $roomType = RoomType::find($id);

        if (!$roomType) {
            if ($request->ajax()) {
                return response([
                    'status' => 0,
                    'message' => 'Dữ liệu không hợp lệ'
                ]);
            }

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

        $data = $request->all();

        if(empty($data['name']))
        {
            if ($request->ajax()) {
                return response([
                    'status' => 0,
                    'message' => 'Không được bỏ trống tên'
                ]);
            }

            return redirect()->back()->with('error', 'Không được bỏ trống tên');
        }
        $features = $request->input('features');

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

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

        $imageData = [];
        if (isset($images)) {
            foreach ($images as $image) {
                $imageData[] = Functions::uploadImage($image);
            }
        }

        $data['images'] = json_encode($imageData);
        $data['features'] = json_encode($features);

        $roomType->update($data);

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

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

    public function createRoomType()
    {
        return view('admin.setting.create_room_type');
    }

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

        if(empty($data['name']))
        {
            if ($request->ajax()) {
                return response([
                    'status' => 0,
                    'message' => 'Không được bỏ trống tên'
                ]);
            }

            return redirect()->back()->with('error', 'Không được bỏ trống tên');
        }

        $features = $request->input('features');
        $data['owner_id'] = auth('backend')->user()->id;
        $images = $request->file('images');
        $imageData = [];
        if (isset($images)) {
            foreach ($images as $image) {
                $imageData[] = Functions::uploadImage($image);
            }
        }

        $data['images'] = json_encode($imageData);
        $data['features'] = json_encode($features);


        RoomType::create($data);

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

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

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

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

    public function deleteAmenity($id)
    {
        Amenity::find($id)->delete();

        return redirect()->back()->with('success', 'Xóa thành công');
    }

	public function deleteTestimonial($id)
	{
		Testimonial::find($id)->delete();

		return redirect()->back()->with('success', 'Xóa thành công');
	}

    public function deleteHostelType($id)
    {
        HostelType::find($id)->delete();

        return redirect()->back()->with('success', 'Xóa thành công');
    }

    public function deleteRoomType($id)
    {
        RoomType::find($id)->delete();

        return redirect()->back()->with('success', 'Xóa thành công');
    }

    public function updateInlineAmenity($id, Request $request)
    {
        $id = $request->input('pk');
        $name = $request->input('name');
        $value = $request->input('value');

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

        $item->update([
            $name => $value
        ]);
    }

	public function updateInlineTestimonial($id, Request $request)
	{
		$id = $request->input('pk');
		$name = $request->input('name');
		$value = $request->input('value');

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

		$item->update([
			$name => $value
		]);

		cache()->forget('testimonials');

		cache()->rememberForever('testimonials', function() {
			return Testimonial::publish()->get();
		});
	}

    public function updateInlineHostelType($id, Request $request)
    {
        $id = $request->input('pk');
        $name = $request->input('name');
        $value = $request->input('value');

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

        $item->update([
            $name => $value
        ]);
    }

    public function updateInlineRoomType($id, Request $request)
    {
        $id = $request->input('pk');
        $name = $request->input('name');
        $value = $request->input('value');

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

        $item->update([
            $name => $value
        ]);
    }

    public function getFeeByAttributeView(Request $request)
    {
        $hostels = Hostel::query();

        if (auth('backend')->check()) {
            if (auth('backend')->user()->type == User::OWNER) {
                $hostels = Hostel::where('owner_id', auth('backend')->user()->id);
            }
        }

        $hostels = $hostels->get();

        return view('admin.setting.fee', compact('hostels'));
    }

    public function getFeeByAttribute(Request $request)
    {
        $items = HostelFee::query();

        if (auth('backend')->check()) {
            if (auth('backend')->user()->type == User::OWNER) {
                $hostels = Hostel::where('owner_id', auth('backend')->user()->id)->pluck('id')->toArray();
                $items = $items->whereIn('hostel_id', $hostels);
            }
        }

        return Datatables::of($items)->addColumn('hostel', function ($item) {


        })->addColumn('hostel', function ($item) {
            if ($item->hostelItem) {
                return $item->hostelItem->name;
            }
        })->editColumn('fee', function ($item) {
            return number_format($item->fee, 0, '.', '.');
        })->addColumn('room', function ($item) {

            return Functions::getRooms($item->rooms);

        })->addColumn('action', function ($item) {

            return
                '<a href="#edit-fee" data-toggle="modal" data-id="' . $item->id . '" class="btn btn-sm green btn-outline btn-edit"> Sửa</a>' .
                '<a href="' . url('admin/setting/fee/delete', ['id' => $item->id]) . '" class="btn btn-sm red btn-outline delete-btn"> Xóa</a><br><br>';
        })
            ->make(true);
    }

    public function getFee($id)
    {
        $hostels = Hostel::query();

        if (auth('backend')->check()) {
            if (auth('backend')->user()->type == User::OWNER) {
                $hostels = Hostel::where('owner_id', auth('backend')->user()->id);
            }
        }

        $hostels = $hostels->get();

        $fee = HostelFee::find($id);

        return response([
            'status' => 1,
            'html' => view('admin.setting.fee_edit', compact('fee', 'hostels'))->render()
        ]);


    }

    public function storeFee(Request $request)
    {
        $data = $request->except('rooms');

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


        $hostelFee = HostelFee::create($data);
        if (empty($rooms)) {


            $roomHostels = Room::where('hostel_id', $data['hostel_id'])->get();

            $hostelFee->update(
                ['rooms' => $roomHostels->pluck('id')->toJson()]
            );

            if ($roomHostels) {
                foreach ($roomHostels as $roomHostel) {
                    RoomFee::create([
                        'room_id' => $roomHostel->id,
                        'hostel_id' => $data['hostel_id'],
                        'fee' => $data['fee'],
                        'name' => $data['name'],
                    ]);
                }
            }

        } else {
            if (is_array($rooms)) {
                $hostelFee->update(
                    ['rooms' => json_encode($rooms)]
                );
                foreach ($rooms as $room) {
                    RoomFee::create([
                        'room_id' => $room,
                        'hostel_id' => $data['hostel_id'],
                        'fee' => $data['fee'],
                        'name' => $data['name'],
                    ]);
                }
            }
        }

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

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


    public function editFee(Request $request)
    {
        $data = $request->except('rooms');

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

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

        $hostelFee = HostelFee::find($id);

        if (!$hostelFee) {
            return response([
                'status' => 0,
                'message' => 'Dữ liệu không hợp lệ'
            ]);
        }


        $hostelFee->update($data);
        if (empty($rooms)) {


            $roomHostels = Room::where('hostel_id', $data['hostel_id'])->get();

            $hostelFee->update(
                ['rooms' => $roomHostels->pluck('id')->toJson()]
            );

            if ($roomHostels) {

                foreach ($roomHostels as $roomHostel) {
                    RoomFee::where('room_id', $roomHostel->id)->where('hostel_id', $data['hostel_id'])->delete();

                    RoomFee::create([
                        'room_id' => $roomHostel->id,
                        'hostel_id' => $data['hostel_id'],
                        'fee' => $data['fee'],
                        'name' => $data['name'],
                    ]);
                }
            }

        } else {
            if (is_array($rooms)) {
                $hostelFee->update(
                    ['rooms' => json_encode($rooms)]
                );
                foreach ($rooms as $room) {
                    RoomFee::where('room_id', $room)->where('hostel_id', $data['hostel_id'])->delete();
                    RoomFee::create([
                        'room_id' => $room,
                        'hostel_id' => $data['hostel_id'],
                        'fee' => $data['fee'],
                        'name' => $data['name'],
                    ]);
                }
            }
        }

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

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

    public function getAmenityImage(Request $request)
    {
        $id = $request->input('id');
        $amenity = Amenity::find($id);
        if ($amenity) {

            $webImage = $amenity->web_image;
            $mobileImage = $amenity->mobile_image;

            if (empty($amenity->web_image)) {
                $webImage = '/frontend3/assets/img/placeholder.png';
            } else {
                $webImage = '/files/' . $webImage;
            }

            if (empty($amenity->mobile_image)) {
                $mobileImage = '/frontend3/assets/img/placeholder.png';
            } else {
                $mobileImage = '/files/' . $mobileImage;
            }

            return [
                'status' => 1,
                'name' => $amenity->name,
                'web' => $webImage,
                'mobile' => $mobileImage
            ];
        }
    }

	public function getTestimonialImage(Request $request)
	{
		$id = $request->input('id');
		$testimonial = Testimonial::find($id);
		if ($testimonial) {

			$webImage = $testimonial->image;


			if (empty($testimonial->image)) {
				$webImage = '/frontend3/assets/img/placeholder.png';
			} else {
				$webImage = '/files/' . $webImage;
			}


			return [
				'status' => 1,
				'name' => $testimonial->name,
				'web' => $webImage,
				'content' => $testimonial->content,
				'status_item' => $testimonial->status,
                'address' => $testimonial->address
			];
		}
	}

    public function updateAmenity($id, Request $request)
    {
        $item = Amenity::find($id);

        $data = $request->all();

        if ($item) {
            if ($request->file('web_image') && $request->file('web_image')->isValid()) {

                $data['web_image'] = Functions::uploadFile($request->file('web_image'));
            }

            if ($request->file('mobile_image') && $request->file('mobile_image')->isValid()) {
                $data['mobile_image'] = Functions::uploadFile($request->file('mobile_image'));
            }

            $item->update($data);

        }

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

	public function updateTestimonial($id, Request $request)
	{
		$item = Testimonial::find($id);

		$data = $request->all();

		if ($item) {
			if ($request->file('image') && $request->file('image')->isValid()) {

				$data['image'] = Functions::uploadFile($request->file('image'));
			}

			$item->update($data);

		}

		cache()->forget('testimonials');

		cache()->rememberForever('testimonials', function() {
			return Testimonial::publish()->get();
		});

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

    public function deleteFee($id, Request $request)
    {
        $fee = HostelFee::find($id);
        if ($fee) {
            $fee->delete();
        }

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

    }
}
