<?php

namespace App\Http\Controllers\Backend;

use App\Components\Functions;
use App\Http\Requests\CreateEditorRequest;
use App\Models\Account;
use App\Models\Contract;
use App\Models\Hostel;
use App\Models\Package;
use App\Models\RenterRoom;
use App\Models\Report;
use App\Models\Room;
use App\Models\SendZaloLog;
use App\Models\UserPackage;
use App\Models\UserPackageFindHostel;
use App\User;
use Carbon\Carbon;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Yajra\Datatables\Datatables;

class AccountController extends Controller {
	//
	public function createOwner( Request $request ) {

	}

	public function userPhone( Request $request ) {
		$q = $request->input( 'q' );

		$phones = User::groupBy( 'phone' )
		              ->where( 'phone', 'LIKE', '%' . $q . '%' )
		              ->limit( 10 )
		              ->pluck( 'phone' )
		              ->toArray();
//        $phoneArr = [];
//
//        foreach ($phones as $phone)
//        {
//            $phoneArr[] = [
//                'id' => $phone->id,
//                'text' => $phone->phone,
//            ];
//        }

		return response( $phones );
	}

	public function getEditors( Request $request ) {
		return view( 'admin.account.editors' );
	}

	public function getEditorsByAttribute( Request $request ) {
		$editors = User::where( 'type', User::EDITOR );

		return Datatables::of( $editors )->editColumn( 'name', function ( $item ) {
			return $item->first_name . ' ' . $item->last_name;
		} )->addColumn( 'action', function ( $item ) {

			$activeText = 'Hủy kích hoạt';

			if ( $item->status == User::IN_ACTIVE ) {
				$activeText = 'Kích hoạt';
			}

			return '<a href="#" class="btn btn-sm red btn-outline btn-active" data-id="' . $item->id . '" data-type="course">' . $activeText . '</a>' .
			       '<a href="' . url( 'admin/owner/edit', [ 'id' => $item->id ] ) . '" class="btn btn-sm green btn-outline "> Sửa</a>' .
			       '<a href="' . url( 'admin/owner/delete', [ 'id' => $item->id ] ) . '" class="btn btn-sm red btn-outline delete-btn"> Xóa</a><br><br>';

		} )->make( true );
	}

	public function createEditor( CreateEditorRequest $request ) {
		$data = $request->except( 'confirm_password' );

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

		$password = \Hash::make( $data['password'] );

		$data['password'] = $password;
		$data['type']     = User::EDITOR;
		$data['status']   = User::ACTIVE;

		User::create( $data );

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

	public function deleteOwner( $id ) {
		$user = User::find( $id );
		if ( $user ) {
			$user->delete();
			$hostelArr = Hostel::where( 'owner_id', $user->id )->pluck( 'id' )->toArray();
			Room::whereIn( 'id', $hostelArr )->delete();
			Contract::whereIn( 'hostel_id', $hostelArr )->delete();
			Hostel::where( 'owner_id', $user->id )->delete();
		}

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

	public function profile() {
		if ( ! auth( 'backend' )->check() ) {
			return redirect()->to( url( '/' ) )->with( 'error', 'Bạn phải đăng nhập' );
		}
		$account = auth( 'backend' )->user();

		return view( 'admin.account.profile', compact( 'account' ) );
	}

	public function update( $id, Request $request ) {
		$user = User::find( $id );

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

		$data = $request->all();

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

		$user->update( $data );

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

	public function checkUniquePhone( Request $request ) {
		$type     = $request->input( 'type' );
		$isEdit   = $request->input( 'is_edit' );
		$phone    = $request->input( 'phone' );
		$typeUser = $request->input( 'type_user' );
		$cnt      = User::where( 'phone', $phone )
		                ->where( 'type', $typeUser )
		                ->count();

		if ( $request->has( 'token_active' ) ) {
			$tokenActive = $request->input( 'token_active' );
			$cnt         = User::query()->where( 'phone', $phone )->where( function ( $q ) use ( $tokenActive ) {
				$q->orWhere( 'token_active', '<>', $tokenActive );
				$q->orWhereNull( 'token_active' );

			} )->where( 'type', $typeUser )->count();
		}

		if ( $type == 'edit' ) {
			$userId = $request->input( 'user_id' );
			$user   = User::find( $userId );
			$cnt    = User::query()->where( 'phone', $phone )->where( 'id', '<>', $userId )->where( 'type', $user->type )->count();
		}


		if ( $isEdit == 1 ) {
			$cnt = User::query()->where( 'phone', $phone )->count();
			$cnt -= 1;
		}
		if ( $cnt > 0 ) {
			return 'false';
		}

		return 'true';
	}

	public function checkUniqueEmail( Request $request ) {
		$type     = $request->input( 'type' );
		$email    = $request->input( 'email' );
		$typeUser = $request->input( 'type_user' );
		$isEdit   = $request->input( 'is_edit' );
		$cnt      = User::query()->where( 'email', $email )->where( 'type', $typeUser )->count();

		if ( $request->has( 'token_active' ) ) {
			$tokenActive = $request->input( 'token_active' );
			$cnt         = User::query()->where( 'email', $email )->where( 'token_active', '<>', $tokenActive )->where( 'type', $typeUser )->count();
		}

		if ( $type == 'edit' ) {
			$userId = $request->input( 'user_id' );
			$user   = User::find( $userId );
			$cnt    = User::query()->where( 'email', $email )->where( 'id', '<>', $userId )->where( 'type', $user->type )->count();
		}
		if ( $isEdit == 1 ) {
			$cnt = User::query()->where( 'email', $email )->count();
			$cnt -= 1;
		}
		if ( $cnt > 0 ) {
			return 'false';
		}

		return 'true';
	}

	public function changePassword( Request $request ) {
		$userId          = auth( 'backend' )->user()->id;
		$currentPassword = $request->input( 'current_password' );
		$newPassword     = $request->input( 'new_password' );
		$retypePassword  = $request->input( 'retype_password' );

		if ( $newPassword != $retypePassword ) {
			if ( $request->ajax() ) {
				return response( [
					'status'  => 0,
					'message' => 'Mật khẩu nhập lại không khớp'
				] );
			}

			return redirect()->back()->with( 'error', 'Mật khẩu nhập lại không khớp' );
		}

		$account = User::find( $userId );

		if ( ! $account ) {
			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ệ' );
		}

		if ( ! \Hash::check( $currentPassword, $account->password ) ) {
			if ( $request->ajax() ) {

				return response( [
					'status'  => 0,
					'message' => 'Mật khẩu hiện tại không chính xác'
				] );
			}

			return redirect()->back()->with( 'error', 'Mật khẩu hiện tại không chính xác' );
		}

		$account->password = \Hash::make( $newPassword );
		$account->save();

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

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

	}

	public function getOwnerByAttributeView( Request $request ) {
		return view( 'admin.account.owner' );
	}

	public function getRenterByAttributeView( Request $request ) {
		return view( 'admin.account.renter' );
	}

	public function addRenterToRoomByCode( Request $request ) {
		$code = $request->input( 'code' );
		$room = $request->input( 'room' );


	}

	public function changeStatus( Request $request ) {

	}

	public function editOwner( $id ) {
		$user = User::find( $id );
		if ( $user ) {
			return view( 'admin.account.edit_owner', compact( 'user' ) );
		}

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

	public function updateOwner( $id, Request $request ) {
		$user = User::find( $id );
		if ( $user ) {

			$data = $request->all();
			$user->update( $data );

			return redirect()->back()->with( 'success', 'Đã update' );
		}

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

	public function getRemainStaff() {
		$remainStaff = 0;
		$userPackage = UserPackage::query()->where( 'user_id', auth( 'backend' )->user()->id )->first();
		if ( $userPackage ) {
			$packageId   = $userPackage->package_id;
			$numberStaff = $userPackage->number_staffs;
			$useStaff    = User::query()->where( 'staff_owner_id', auth( 'backend' )->user()->id )->count();
			$remainStaff = $numberStaff - $useStaff;
			if ( $remainStaff < 0 ) {
				$remainStaff = 0;
			}

		}

		if ( $remainStaff == 0 ) {
			return response( [
				'status'  => 1,
				'message' => 'Số nhân viên còn lại có thể tạo: 0. Nếu bạn muốn tạo thêm nhân viên vui lòng nâng cấp gói cước hoặc gọi cho chúng tôi để được hỗ trợ'
			] );
		}

		return response( [
			'status'  => 1,
			'message' => 'Số nhân viên còn lại có thể tạo: ' . $remainStaff
		] );

	}

	public function getRenterByAttribute( Request $request ) {
		$renters = User::query()->where( 'type', User::RENTER );

		return Datatables::of( $renters )->editColumn( 'register_by', function ( $item ) {
			return $item->register_by_text;

		} )->editColumn( 'status', function ( $item ) {
			return $item->status_text;
		} )->editColumn( 'current_room', function ( $item ) {
			if ( $item->currentRoom ) {
				return $item->currentRoom->name;
			}
		} )->editColumn( 'current_hostel', function ( $item ) {
			if ( $item->currentHostel ) {
				return $item->currentHostel->name;
			}
		} )->editColumn( 'created_at', function ( $item ) {
			return $item->created_at->format( 'd/m/Y' );
		} )->addColumn( 'action', function ( $item ) {

			$activeText = 'Hủy kích hoạt';

			if ( $item->status == User::IN_ACTIVE ) {
				$activeText = 'Kích hoạt';
			}

			return '<a href="#" class="btn btn-sm red btn-outline btn-active" data-id="' . $item->id . '" data-type="course">' . $activeText . '</a>' .
			       '<a href="' . url( 'admin/owner/edit', [ 'id' => $item->id ] ) . '" class="btn btn-sm green btn-outline "> Sửa</a>' .
			       '<a href="' . url( 'admin/owner/delete', [ 'id' => $item->id ] ) . '" class="btn btn-sm red btn-outline delete-btn"> Xóa</a><br><br>';

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


		} )->make( true );
	}

	public function getInfo( $id ) {
		$account = User::withTrashed()->find( $id );

		return response( [
			'status' => 1,
			'html'   => view( 'admin.account.info', compact( 'account' ) )->render()
		] );
	}

	public function exportOwner( Request $request ) {
		$startDate = $request->input( 'start_date' );
		$endDate   = $request->input( 'end_date' );

		$items = User::where( 'type', User::OWNER );

		if ( ! empty( $startDate ) ) {
			$startDate = Carbon::createFromFormat( 'd/m/Y', $startDate )->startOfDay()->toDateTimeString();
			$items     = $items->where( 'created_at', '>=', $startDate );
		}

		if ( ! empty( $endDate ) ) {
			$endDate = Carbon::createFromFormat( 'd/m/Y', $endDate )->endOfDay()->toDateTimeString();
			$items   = $items->where( 'created_at', '<=', $endDate );
		}

		$items = $items->orderBy( 'id', 'desc' )->get();

		$responseArr = [];

		foreach ( $items as $item ) {
			$itemArr = [];

			$hostels = Hostel::where( 'owner_id', $item->id )->pluck( 'id' )->toArray();
			$cntRoom = Room::whereIn( 'hostel_id', $hostels )->count();

			$itemArr['Tên']          = $item->name_text;
			$itemArr['SĐT']          = $item->phone;
			$itemArr['Email']        = $item->email;
			$itemArr['Địa chỉ']      = $item->address_text;
			$itemArr['Số nhà trọ']   = Hostel::where( 'owner_id', $item->id )->count();
			$itemArr['Số phòng trọ'] = $cntRoom;
			$itemArr['Nguồn']        = $item->from_text;
			$itemArr['Ngày tạo']     = $item->created_at->format( 'd/m/Y' );
			$responseArr[]           = $itemArr;
		}

		$name = 'chu-tro';

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

	public function getRenters( Request $request ) {
		$hostelId = $request->input( 'hostel_id' );
		$floor    = $request->input( 'floor' );
		$roomId   = $request->input( 'room_id' );

		$renters = User::query()->select( \DB::raw( 'users.*' ) )->where( 'users.type', User::RENTER )
		               ->join( 'renter_rooms', 'users.id', '=', 'renter_rooms.user_id' )
		               ->orderBy( 'users.id', 'desc' );
		$hostels = Hostel::all();

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

				$renters = $renters->whereIn( 'renter_rooms.room_id', $rooms );
			}
		}

		$renters = $renters->join( 'rooms', 'renter_rooms.room_id', '=', 'rooms.id' )
		                   ->join( 'hostels', 'rooms.hostel_id', '=', 'hostels.id' );

		if ( ! empty( $hostelId ) ) {
			$renters = $renters->where( 'hostels.id', $hostelId );
		}

		if ( ! empty( $roomId ) ) {
			$renters = $renters->where( 'rooms.id', $roomId );
		}

		if ( ! empty( $floor ) ) {
			$renters = $renters->where( 'hostels.floor', $floor );
		}

		if ( $request->ajax() ) {
			$renters = $renters->get();

			return response( [
				'status' => 1,
				'html'   => view( 'admin.room.renter_ajax', compact( 'renters', 'hostels', 'hostelId' ) )->render()
			] );
		};


		$renters = $renters->paginate( 12 );

		return view( 'admin.account.renter_2', compact( 'renters', 'hostels' ) );
	}

	public function detail( $id ) {
		$user = User::find( $id );
		if ( $user ) {
			return view( 'admin.account.detail', compact( 'user' ) );
		}

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

	public function getOwnerByAttribute( Request $request ) {
		$owners = User::query()
		              ->withCount( [
			              'hostels',
			              'rooms'
		              ] )
		              ->where( 'type', User::OWNER )
		              ->when( ! empty( $request->input( 'hostel_status' ) ), function ( $q ) {
			              if ( \request()->input( 'hostel_status' ) == 'created' ) {
				              $q->has( 'hostels' );
			              } else {
				              $q->doesntHave( 'hostels' );
			              }
		              } )->when( ! empty( $request->input( 'room_status' ) ), function ( $q ) {
				if ( \request()->input( 'room_status' ) == 'created' ) {
					$q->has( 'rooms' );
				} else {
					$q->doesntHave( 'rooms' );
				}
			} )->when( ! empty( $request->input( 'start_date' ) ), function ( $q ) {
				$startDate = Carbon::createFromFormat( 'd/m/Y', \request()->input( 'start_date' ) );
				$q->where( 'created_at', '>=', $startDate->copy()->startOfDay() );
			} )->when( ! empty( $request->input( 'end_date' ) ), function ( $q ) {
				$endDate = Carbon::createFromFormat( 'd/m/Y', \request()->input( 'end_date' ) );
				$q->where( 'created_at', '<=', $endDate->copy()->endOfDay() );
			} )
		              ->when( ! empty( $request->input( 'owner_id' ) ), function ( $q ) {
			              $q->where( 'id', '=', request()->input( 'owner_id' ) );
		              } );

		return Datatables::of( $owners )
		                 ->filterColumn( 'hostels_count', function ( $query, $keyword ) {
			                 $query->has( 'hostels', $keyword );
		                 } )
		                 ->filterColumn( 'rooms_count', function ( $query, $keyword ) {
			                 $query->has( 'rooms', $keyword );
		                 } )
		                 ->editColumn( 'register_by', function ( $item ) {
			                 return $item->register_by_text;

		                 } )->editColumn( 'name', function ( $item ) {
				return '<div style="min-width: 220px">' . $item->name_text . '</div>';

			} )->editColumn( 'status', function ( $item ) {
				return $item->status_text;
			} )->editColumn( 'created_at', function ( $item ) {
				return $item->created_at->format( 'd/m/Y H:i' );
			} )->editColumn( 'from', function ( $item ) {
				return '<div style="min-width: 120px">' . $item->from_text . '</div>';
			} )->editColumn( 'address', function ( $item ) {
				return $item->address_text;
			} )->editColumn( 'last_login_at', function ( $item ) {
				if ( ! empty( $item->last_login_at ) ) {
					return $item->last_login_at->format( 'd/m/Y H:i' );
				}

				return null;
			} )->editColumn( 'payment_status', function ( $item ) {
				return '<div style="min-width: 100px"> <a data-source="' . url( 'admin/account/payment-status' ) . '" href="javascript:;" data-type="select" data-pk="' . $item->id . '" data-placement="left" data-emptytext="Chưa xác định"
                                       data-name="payment_status" data-value="' . $item->payment_status . '"
                                       data-original-title="Nhập giá trị" id="payment-status-' . $item->id . '"
                                       data-placeholder="Vui lòng chọn"
                                       class="editable editable-status editable-click editable-empty">' . $item->payment_status_text . '</a></div>';
			} )
		                 ->editColumn( 'hostels_count', function ( $item ) {
			                 return '<a target="_blank" href="' . url( 'admin/hostel?owner_id=' . $item->id ) . '">' . $item->hostels_count . '</a>';
		                 } )
		                 ->editColumn( 'rooms_count', function ( $item ) {
			                 return '<a target="_blank" href="' . url( 'admin/room?owner_id=' . $item->id ) . '">' . $item->rooms_count . '</a>';
		                 } )->editColumn( 'branch_app', function ( $item ) {
				$branch = null;
				if ( $item->branch_app == User::BRANCH_FIND ) {
					$branch = 'Tìm khách';
				} else {
					$branch = 'Quản lý';
				}

				return '<div style="min-width: 120px">' . $branch . '</div>';

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

				$activeText = 'Hủy kích hoạt';

				if ( $item->status == User::IN_ACTIVE ) {
					$activeText = 'Kích hoạt';
				}

				return '<a href="#" class="btn btn-sm red btn-outline btn-active" data-id="' . $item->id . '" data-type="course">' . $activeText . '</a><br>' .
				       '<a href="' . url( 'admin/owner/edit', [ 'id' => $item->id ] ) . '" class="btn btn-sm green btn-outline "> Sửa</a>' .
				       '<a href="' . url( 'admin/owner/delete', [ 'id' => $item->id ] ) . '" class="btn btn-sm red btn-outline delete-btn"> Xóa</a><br>' .
				       '<a href="#edit-package" data-id="' . $item->id . '" data-toggle="modal" class="btn btn-sm yellow btn-outline btn-edit-package"> Thông tin gói</a>' .
				       '<a href="#change-password" data-id="' . $item->id . '" data-toggle="modal" class="btn btn-sm yellow btn-outline btn-change-password"> Đổi mk</a>';

			} )->make( true );
	}

	public function getPackageContent( Request $request ) {
		$packageId           = $request->input( 'package_id' );
		$packageFindHostelId = $request->input( 'package_find_hostel_id' );
		$info                = Package::find( $packageId );
		$infoFindHostel      = \App\Models_v2\Package::find( $packageFindHostelId );

		$numberHostels   = 1;
		$numberRooms     = 30;
		$numberStaffs    = 5;
		$numberInteracts = 0;

		if ( $info ) {
			$numberHostels = $info->number_hostels;
			$numberRooms   = $info->number_rooms;
			$numberStaffs  = $info->number_staffs;
		}

		if ( ! empty( $request->input( 'user_id' ) ) ) {
			$userPackage   = UserPackage::query()->where( 'user_id', $request->input( 'user_id' ) )->first();
			$numberHostels = $userPackage->number_hostels;
			$numberRooms   = $userPackage->number_rooms;
			$numberStaffs  = $userPackage->number_staffs;
		}


		if ( $infoFindHostel ) {
			$numberInteracts = $infoFindHostel->number_interact;
		}

		return response( [
			'status' => 1,
			'data'   => [
				'number_hostels'   => $numberHostels,
				'number_rooms'     => $numberRooms,
				'number_staffs'    => $numberStaffs,
				'number_interacts' => $numberInteracts
			]
		] );
	}

	public function editPackage( Request $request ) {
		$accountId      = $request->input( 'account_id' );
		$info           = UserPackage::query()->where( 'user_id', $accountId )->first();
		$infoFindHostel = UserPackageFindHostel::query()->where( 'user_id', $accountId )->first();

		$numberHostels = 1;
		$numberRooms   = 30;
		$numberStaffs  = 5;
		$account       = User::find( $accountId );

		$startDate = auth( 'backend' )->user()->created_at->format( 'd/m/Y' );
		$endDate   = auth( 'backend' )->user()->created_at->addMonth( 1 )->format( 'd/m/Y' );
		if ( $account ) {

			$startDate = $account->created_at->format( 'd/m/Y' );
			$endDate   = $account->created_at->addMonth( 1 )->format( 'd/m/Y' );
		}

		$currentPackage           = 1;
		$currentPackageFindHostel = null;
		$numberInteracts          = 0;
		if ( $info ) {
			$numberHostels = $info->number_hostels;
			$numberRooms   = $info->number_rooms;
			$numberStaffs  = $info->number_staffs;

			if ( ! empty( $info->start_date ) ) {
				$startDate = $info->start_date->format( 'd/m/Y' );
			}

			if ( ! empty( $info->end_date ) ) {
				$endDate = $info->end_date->format( 'd/m/Y' );
			}

			$currentPackage = $info->package_id;

		}

		if ( $infoFindHostel ) {
			$currentPackageFindHostel = $infoFindHostel->package_id;
			$numberInteracts = $infoFindHostel->number_interacts;
		}
		$numberViewLeads = $account->number_view_leads;
        $numberZaloMess = $account->number_zalo_mess;

		return response( [
			'status' => 1,
			'html'   => view( 'admin.account.edit_package', compact( 'numberRooms', 'numberHostels', 'currentPackageFindHostel', 'numberInteracts',
				'numberStaffs', 'currentPackage', 'accountId', 'startDate', 'endDate', 'numberViewLeads', 'account', 'numberZaloMess' ) )->render()
		] );

	}

	public function changePasswordView( Request $request ) {
		$accountId = $request->input( 'account_id' );

		return response( [
			'status' => 1,
			'data'   => view( 'admin.account.change_password', compact( 'accountId' ) )->render()
		] );
	}

	public function changePasswordAjax( Request $request ) {
		$accountId = $request->input( 'account_id' );
		$password  = $request->input( 'password' );
		$account   = User::find( $accountId );
		if ( $account ) {
			if ( ! empty( $password ) ) {
				$account->password = \Hash::make( $password );
				$account->save();
			}
		}

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

	public function updatePackage( Request $request ) {
		$packageId           = $request->input( 'package_id' );
		$packageFindHostelId = $request->input( 'package_find_hostel_id' );
		$userId              = $request->input( 'account_id' );
		$info                = UserPackage::query()->where( 'user_id', $userId )->first();
		$isPartnerLogo       = $request->input( 'is_partner_logo' );

		$data            = $request->except( [
			'number_view_leads',
			'package_find_hostel_id'
		] );
		$numberViewLeads = $request->input( 'number_view_leads' );
		$numberInteracts = $request->input( 'number_interacts' );

		$startDate       = null;
		$endDate         = null;
		$startDateCarbon = null;
		$endDateCarbon   = null;

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

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

		$data['start_date'] = $startDate;
		$data['end_date']   = $endDate;
		$data['user_id']    = $userId;

		if ( ! empty( $startDateCarbon ) && ! empty( $endDateCarbon ) ) {
			if ( $startDateCarbon->greaterThan( $endDateCarbon ) ) {
				return response( [
					'status'  => 0,
					'message' => 'Ngày kết thúc phải lớn hơn ngày bắt đầu'
				] );
			}
		}
		if ( $info ) {
			$info->update( $data );
		} else {
			UserPackage::create( $data );
		}

		$user = User::find( $userId );
		if ( $user ) {
			//$user->increment( 'number_view_leads', $numberViewLeads );
			$user->number_view_leads = $numberViewLeads;
			if ( $isPartnerLogo == 'on' ) {
				$user->is_partner_logo = true;
			} else {
				$user->is_partner_logo = false;
			}
		}

		if ( ! empty( $packageFindHostelId ) ) {
			$packageFindHostel = \App\Models_v2\Package::find( $packageFindHostelId );
			if ( $packageFindHostel ) {
				$pricePerMonth  = $packageFindHostel->price;
				$transactionFee = $packageFindHostel->transaction_fee;

				UserPackageFindHostel::query()->updateOrCreate( [
					'user_id' => $userId,
				], [
					'user_id'          => $userId,
					'package_id'       => $packageFindHostelId,
					'price_per_month'  => $pricePerMonth,
					'number_interacts' => $numberInteracts,
					'transaction_fee'  => $transactionFee
				] );

				if ( empty( $packageFindHostel->number_interact ) ) {
					$user->number_interacts = config( 'constants.MAX_INTERACTS' );
				} else {
					$user->number_interacts = $numberInteracts;
				}
			}
		} else {
			UserPackageFindHostel::query()->where( 'user_id', $userId )->delete();
			$user->number_interacts = 0;
		}

		$newNumberZaloMess = $request->input('number_zalo_mess');
		$change = $newNumberZaloMess - $user->number_zalo_mess;

		$user->number_zalo_mess = $newNumberZaloMess;
		$user->save();

		if(!empty($change)) {

            SendZaloLog::create([
                'user_id' => $user->id,
                'type' => SendZaloLog::TYPE_ADD,
                'number_change' => $change
            ]);
        }


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

	}

	public function updateRenterStatus( Request $request ) {
		$dateJoined      = $request->input( 'date_joined' );
		$residenceStatus = $request->input( 'residence_status' );
		$userId          = $request->input( 'user_id' );

		$renterRoom = RenterRoom::query()->where( 'user_id', $userId )->first();

		if ( $renterRoom ) {
			if ( ! empty( $dateJoined ) ) {
				$renterRoom->date_joined = Carbon::createFromFormat( 'd/m/Y', $dateJoined )->toDateTimeString();
			}

			if ( ! is_null( $residenceStatus ) ) {
				$renterRoom->residence_status = $residenceStatus;
			}
			$renterRoom->save();
		}

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

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

	}

	public function getRenterFindAppByAttribute( Request $request ) {
		$items = User::query()
		             ->select( '*' )
		             ->withCount( [
			             'findSessions'
		             ] )
		             ->where( 'branch_app', User::BRANCH_FIND )
		             ->where( 'type', User::RENTER )
		             ->when( ! \request()->has( 'order' ), function ( $q ) {
			             $q->orderBy( 'created_at', 'desc' );
		             } );

		return Datatables::of( $items )
		                 ->filterColumn( 'find_sessions_count', function ( $q, $keyword ) {
			                 $q->has( 'findSessions', $keyword );
		                 } )
		                 ->editColumn( 'find_sessions_count', function ( $item ) {
			                 return '<a target="_blank" href="' . url( 'admin/request-find?user_id=' . $item->id ) . '">' . $item->find_sessions_count . '</a>';
		                 } )
		                 ->editColumn( 'last_login_at', function ( $item ) {
			                 if ( ! empty( $item->last_login_at ) ) {
				                 return $item->last_login_at->format( 'd/m/Y H:i' );
			                 }

			                 return null;
		                 } )
		                 ->editColumn( 'last_find_at', function ( $item ) {
			                 if ( ! empty( $item->last_find_at ) ) {
				                 return $item->last_find_at->format( 'd/m/Y H:i' );
			                 }

			                 return null;
		                 } )
		                 ->editColumn( 'created_at', function ( $item ) {
			                 return $item->created_at->format( 'd/m/Y H:i' );
		                 } )
		                 ->addColumn( 'last_find', function ( $item ) {
			                 return optional( optional( $item->findSessions->first() )->created_at )->format( 'd/m/Y H:i' );
		                 } )
		                 ->editColumn( 'from', function ( $item ) {
			                 return '<div style="min-width: 120px">' . $item->from_text . '</div>';
		                 } )
		                 ->make( true );
	}

	public function getPaymentStatus() {
		return response( [
			[
				'value' => User::PAYMENT_TRIAL,
				'text'  => 'Dùng thử'
			],
			[
				'value' => User::PAYMENT_PAYING,
				'text'  => 'Đang trả tiền'
			],
			[
				'value' => User::PAYMENT_OVER,
				'text'  => 'Quá hạn'
			],
			[
				'value' => User::PAYMENT_NOT_USE,
				'text'  => 'Không sử dụng nữa'
			],
		] );
	}

	public function updateAttribute( Request $request ) {
		$id     = $request->input( 'pk' );
		$value  = $request->input( 'value' );
		$hostel = User::find( $id );
		$name   = $request->input( 'name' );

		$hostel->$name = $value;
		$hostel->save();

		return 1;
	}


}
