<?php

namespace App\Http\Controllers\Backend2;

use App\Components\Functions;
use App\Events\LogAction;
use App\Http\Controllers\Backend\AdminController;
use App\Models\CollectSpend;
use App\Models\Hostel;
use App\Models\Renter;
use App\Models\RenterBike;
use App\Models\Room;
use App\User;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Yajra\Datatables\Datatables;

class BikeController extends AdminController
{
    //
    public function getBikeByAttributeView()
    {
        $hostelsArr = Hostel::where('owner_id', auth('backend')->user()->id)->pluck('id')->toArray();

        if (auth('backend')->user()->type == User::STAFF) {
            // $hostelsArr = Hostel::where('owner_id', auth('backend')->user()->staff_owner_id)->pluck('id')->toArray();

            $hostelsArr = Functions::getHostelArrStaff();
        }
        $rooms = Room::whereIn('hostel_id', $hostelsArr)->get();
        $hostels = Hostel::query()->whereIn('id', $hostelsArr)->get();
        return view('admin2.renter.bike', compact('rooms', 'hostels'));
    }

    public function create(Request $request)
    {
        $user = auth('backend')->user();
        $ownerId = $user->id;
        if ($user->type == User::STAFF) {
            $ownerId = $user->staff_owner_id;
        }

        $hostels = Hostel::query()
            ->where('owner_id', $ownerId)
            ->get();
        return response([
            'status' => 1,
            'data' => view('admin2.renter.add_bike', compact('hostels'))->render()
        ]);
    }

    public function edit($id)
    {
        $bike = RenterBike::find($id);

        return response([
            'status' => 1,
            'data' => view('admin2.renter.edit_bike', compact('bike'))->render()
        ]);
    }


    public function editView(Request $request)
    {
        $id = $request->input('id');
        $bike = RenterBike::find($id);
        $user = auth('backend')->user();
        $ownerId = $user->id;
        if ($user->type == User::STAFF) {
            $ownerId = $user->staff_owner_id;
        }

        $hostels = Hostel::query()
            ->where('owner_id', $ownerId)
            ->get();
        return response([
            'status' => 1,
            'data' => view('admin2.renter.add_bike', [
                'item' => $bike,
                'hostels' => $hostels
            ])->render()
        ]);
    }

    public function store(Request $request)
    {
        $bikeName = $request->input('name');
        $bikeType = $request->input('type');
        $bikeBk = $request->input('bks');
        $roomId = $request->input('room_id');
        $renterId = $request->input('renter_id');

        $renter = Renter::find($renterId);

        $image = null;
        if (!empty($request->file('image'))) {
            $image = Functions::uploadImage($request->file('image'));
        }

        $item = RenterBike::create([
            'name' => $bikeName,
            'type' => $bikeType,
            'bks' => $bikeBk,
            'room_id' => $renter->room_id,
            'renter_id' => $renter->user_id,
            'image' => $image
        ]);

        $user = Functions::getCurrentUser();
        $renter = User::find($item->renter_id);
        if($renter) {
            $room = Room::find($item->room_id);
            $desc = '{' . $user->name . '} thêm xe cho khách {' . $renter->name . '} phòng {' . $room->name . '} nhà {' . $room->hostel->name . '}';
            event(new LogAction([
                'type' => 'create-bike',
                'user_id' => optional($user)->id,
                'object_id' => $item->id,
                'hostel_id' => $room->hostel_id,
                'room_id' => $room->id,
                'properties' => $item->toArray(),
                'desc' => $desc
            ]));
        }

        return response([
            'status' => 1
        ]);
    }

    public function update2(Request $request)
    {
        $bikeName = $request->input('name');
        $bikeType = $request->input('type');
        $bikeBk = $request->input('bks');
        $roomId = $request->input('room_id');
        $renterId = $request->input('renter_id');

        $renter = Renter::find($renterId);

        $item = RenterBike::find($request->input('id'));
        $image = $item->image;
        if (!empty($request->file('image'))) {
            $image = Functions::uploadImage($request->file('image'));
        }
        $item->update([
            'name' => $bikeName,
            'type' => $bikeType,
            'bks' => $bikeBk,
            'room_id' => $renter->room_id,
            'renter_id' => $renter->user_id,
            'image' => $image
        ]);

        $renter = User::find($item->renter_id);
        if ($renter) {
            $room = Room::find($item->room_id);
            $user = Functions::getCurrentUser();
            $desc = '{' . $user->name . '} cập nhật xe của khách {' . $renter->name . '} phòng {' . $room->name . '} nhà {' . $room->hostel->name . '}';
            event(new LogAction([
                'type' => 'update-bike',
                'user_id' => optional($user)->id,
                'object_id' => $item->id,
                'hostel_id' => $room->hostel_id,
                'room_id' => $room->id,
                'properties' => $item->toArray(),
                'desc' => $desc
            ]));
        }

        return response([
            'status' => 1
        ]);
    }

    public function update(Request $request)
    {
        if (auth('backend')->user()->cannot('edit-bike')) {
            abort(403);
        }
        $id = $request->input('id');
        $data = $request->all();
        $renter = Renter::find($id);
        if (!$renter) {
            return response([
                'status' => 0,
                'message' => 'Dữ liệu không hợp lệ'
            ]);
        }

        try {

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


            if (!empty($data['date_join'])) {
                $data['date_join'] = Carbon::createFromFormat('d/m/Y', $data['date_join'])->toDateString();
            }

            \DB::beginTransaction();

            $roomId = $renter->room_id;

            $contract = Contract::where('room_id', $roomId)->where('renter_id', $renter->user_id)->update([
                'name' => $data['name'],
                'id_number' => $data['id_number'],
                'date_join' => $data['date_join']
            ]);

            $renterRoom = RenterRoom::where('room_id', $roomId)->where('user_id', $renter->user_id)->first();
            if ($renterRoom) {
                $renterRoom->date_joined = $data['date_join'];
                $renterRoom->residence_status = $data['residence_status'];

                if ($data['residence_status'] == RenterRoom::RESIDENCE_LIMIT) {
                    if (!empty($data['date_end_residence'])) {
                        $data['date_end_residence'] = Carbon::createFromFormat('d/m/Y', $data['date_end_residence'])->toDateString();
                        $renterRoom->date_end_residence = $data['date_end_residence'];
                    }
                }

                $renterRoom->save();
            }

            $data['date_joined'] = $data['date_join'];
            unset($data['date_join']);
            $renter->update($data);

            $bikeNames = $request->input('bike_names');
            $bikeTypes = $request->input('bike_types');
            $bikeBks = $request->input('bike_bks');

            if (is_array($bikeNames)) {
                foreach ($bikeNames as $key => $bikeName) {
                    $bikeBk = empty($bikeBks[$key]) ? 0 : $bikeBks[$key];
                    $bikeType = empty($bikeTypes[$key]) ? 0 : $bikeTypes[$key];
                    $bikeName = empty($bikeNames[$key]) ? 0 : $bikeNames[$key];

                    RenterBike::create([
                        'name' => $bikeName,
                        'type' => $bikeType,
                        'bks' => $bikeBk,
                        'room_id' => $renter->room_id,
                        'renter_id' => $renter->user_id,
                    ]);
                }
            }
            \DB::commit();
        } catch (\Exception $exception) {
            \DB::rollBack();

            return response([
                'status' => 0,
                'message' => 'Có lỗi xảy ra vui lòng thử lại sau'
            ]);
        }

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

    public function getBikeByAttribute(Request $request)
    {
        if (auth('backend')->user()->cannot('view-bike')) {
            abort(403);
        }
        $hostelId = $request->input('hostel_id');
        $isExport = $request->input('is_export');
        if (empty($hostelId)) {
            $hostelsArr = Hostel::where('owner_id', auth('backend')->user()->id)->pluck('id')->toArray();

            if (auth('backend')->user()->type == User::STAFF) {
                // $hostelsArr = Hostel::where('owner_id', auth('backend')->user()->staff_owner_id)->pluck('id')->toArray();

                $hostelsArr = Functions::getHostelArrStaff();
            }


        } else {
            $hostelsArr = [$hostelId];
        }

        $items = RenterBike::query();

        $items = $items->select(\DB::raw('renter_bikes.*'))
            ->join('rooms', 'renter_bikes.room_id', '=', 'rooms.id')
            ->with('renter')
            ->with('room')
            ->has('room')
            ->whereIn('rooms.hostel_id', $hostelsArr);
        if ($isExport) {
            $itemsExcel = clone $items;
            $itemsExcel = $itemsExcel->orderBy('created_at', 'desc')->get();

            $responseArr = [];

            foreach ($itemsExcel as $itemE) {
                $itemArr['Tên'] = $itemE->money_info_code;
                $itemArr['Loại'] = $itemE->type_text;
                $itemArr['BKS'] = $itemE->bks;
                //  $itemArr['Hình ảnh'] = $itemE->image;
                $itemArr['Người thuê'] = $itemE->renter->name_text;
                $itemArr['Phòng trọ'] = !empty($itemE->room) ? $itemE->room->name : '';
                $itemArr['Nhà trọ'] = !empty($itemE->room->hostel) ? $itemE->room->hostel->name : '';
                $responseArr[] = $itemArr;
            }

            $name = 'Phuong-tien';
            return \Excel::create($name . '-' . time(), function ($excel) use ($responseArr, $name) {
                $excel->sheet($name, function ($sheet) use ($responseArr) {
                    $sheet->fromArray($responseArr);
                });
            })->download('xls');
        }

        return Datatables::of($items)
            ->addIndexColumn()
            ->filterColumn('room_id', function ($q, $k) {
                $q->where('renter_bikes.room_id', $k);
            })
            ->filterColumn('hostel_id', function ($q, $k) {
                $q->whereHas('room.hostel', function ($q) use ($k) {
                    $q->where('hostels.id', $k);
                });
            })
            ->editColumn('type', function ($item) {
                return $item->type_text;
            })
            ->editColumn('renter_id', function ($item) {
                if ($item->renter) {
                    return $item->renter->name_text;
                }
            })
            ->editColumn('image', function ($item) {
                if ($item->image) {
                    return '<img src="' . url('files/' . $item->image) . '" style="max-width: 120px" alt="">';
                }
            })
            ->editColumn('room_id', function ($item) {
                if ($item->room) {
                    return $item->room->name;
                }
            })
            ->editColumn('hostel_id', function ($item) {
                if ($item->room) {
                    if ($item->room->hostel) {
                        return $item->room->hostel->name;
                    }

                }
            })
            ->addColumn('action', function ($item) {
                $val = '<a data-toggle="modal" href="#edit-bike" data-id="' . $item->id . '" class="btn btn-sm btn-outline btn-editable btn-edit dark black"><i class="fa fa-edit"></i> Sửa</a>';
                if (auth('backend')->user()->can('delete-bike')) {
                    $val .= '<a href="admin2/room/delete-bike" data-id="' . $item->id . '" class="btn btn-sm btn-outline btn-editable btn-delete-bike-list dark black"><i class="fa fa-trash"></i> Xóa</a>';
                }
                return $val;
            })
            ->make(true);
    }

}
