<?php


namespace App\Services;


use App\Components\Functions;
use App\Models\CollectSpend;
use App\Models\Contract;
use App\Models\Hostel;
use App\Models\HostelFee;
use App\Models\MoneyDetail;
use App\Models\MoneyInfo;
use App\Models\Renter;
use App\Models\RenterRoom;
use App\Models\RoomBed;
use App\Models\RoomReservation;
use App\Models\Transaction;
use App\User;
use Carbon\Carbon;

class ContractService {
	protected $params;

	public function __construct( $params ) {
		$this->params = $params;
	}

	public function store() {
		$params   = $this->params;
		$data     = $this->params;
		$hostel   = $params['hostel'];
		$room     = $params['room'];
		$roomId   = $room->id;
		$hostelId = $hostel->id;

		try {
			$data['hostel_id'] = $hostel->id;
			$hostelTypeRent    = $hostel->type_rent;

			if ( $hostelTypeRent == Hostel::TYPE_RENT_EVERY ) {
				$maxRenters          = $room->max_renters;
				$currentNumberRenter = RenterRoom::query()->where( 'room_id', $room->id )->count();
				RoomBed::query()->where( 'id', $data['bed_id'] )->update( [
					'status' => RoomBed::UNAVAILABLE,
				] );
				if ( $maxRenters == $currentNumberRenter ) {
					return [
						'status'  => 0,
						'message' => 'Bạn không thể thêm quá số người tối đa phòng '.$room->name.', nhà '.$hostel->name
					];
				}
			}

			if ( $hostelTypeRent == Hostel::TYPE_RENT_ALL ) {
				$checkContractValidated = Contract::query()->where( 'status', '<>', Contract::LIQUIDATED )
				                                  ->where( 'room_id', $roomId )
				                                  ->count();

				if ( $checkContractValidated ) {
					return [
						'status'  => 1,
						'message' => 'Bạn cần thanh lý HĐ phòng ' . $room->name . ' nhà ' . $hostel->name . ' trước khi tạo HĐ mới'
					];
				}
			}
//			$data['user_id'] = auth( 'backend' )->user()->id;

			$contract       = Contract::create( $data );
			$reserveDeposit = 0;
			$reserve        = null;
            $dateContractCarbon = Carbon::createFromFormat('Y-m-d', $data['date_contract']);

			if ( ! empty( $reserveId ) ) {
				$reserve = RoomReservation::find( $reserveId );
				if ( $data['phone'] != $reserve->phone ) {
					return [
						'status'  => 0,
						'message' => 'Bạn không thể tạo hợp đồng với số điện thoại: ' . $data['phone'] . ' vì đang có đặt cọc của số điện thoại: ' . $reserve->phone . ', phòng ' . $room->name . ', nhà ' . $hostel->name
					];
				}
				if ( $reserve ) {
					CollectSpend::query()->where( 'reserve_id', $reserve->id )
					            ->update( [
						            'contract_id'       => $contract->id,
						            'is_return_deposit' => true,
					            ] );
					$reserveDeposit = $reserve->deposit;
					$reserve->delete();
				}

				if ( $room->hostel->type_rent == Hostel::TYPE_RENT_ALL ) {
					$reserve = RoomReservation::query()->where( 'room_id', $reserveId )->first();
					if ( $reserve ) {
						CollectSpend::query()->where( 'reserve_id', $reserve->id )
						            ->update( [
							            'contract_id'       => $contract->id,
							            'is_return_deposit' => true,
						            ] );
						$reserveDeposit = $reserve->deposit;
						$reserve->delete();
					}
				}


				if ( ! empty( $reserveDeposit ) ) {

					$transaction = Transaction::create( [
						'money_info_id' => null,
						'amount'        => $reserveDeposit,
						'note'          => 'Thanh toán tiền đặt cọc giữ chỗ HĐ ' . 'HD' . $contract->id . Carbon::now()->format( 'dmY' ),
						'room_id'       => $roomId,
						'hostel_id'     => $hostel->id,
						'date_action'   => Carbon::now()->toDateString(),
						'type'          => CollectSpend::SPEND
					] );

					CollectSpend::create( [
						'amount'            => $reserveDeposit,
						'hostel_id'         => $hostel->id,
						'room_id'           => $roomId,
						'note'              => 'Thanh toán tiền cọc giữ chỗ HĐ ' . 'HD' . $contract->id . Carbon::now()->format( 'dmY' ),
						'name'              => 'Thanh toán tiền cọc giữ chỗ HĐ ' . 'HD' . $contract->id . Carbon::now()->format( 'dmY' ),
						'payment_method'    => CollectSpend::MONEY,
						'date_action'       => Carbon::now()->toDateString(),
						'user_id'           => $contract->renter_id,
						'money_info_id'     => null,
						'type'              => CollectSpend::SPEND,
						'transaction_id'    => $transaction->id,
						'contract_id'       => $contract->id,
						'is_deposit'        => true,
						'is_return_deposit' => true
					] );
				}
			}

			$contract->update( [
				'code' => 'HD' . $contract->id . Carbon::now()->format( 'dmY' )
			] );


			if ( $data['deposit'] > 0 ) {

				$transaction = Transaction::create( [
					'amount'      => $data['deposit'],
					'hostel_id'   => $hostelId,
					'room_id'     => $roomId,
					'bed_id'      => $data['bed_id'],
					'date_action' => ! empty( $dateContractCarbon ) ? $dateContractCarbon->copy()->toDateString() : Carbon::now()->toDateString(),
					'type'        => CollectSpend::COLLECT,
					'note'        => 'Thu tiền đặt cọc Hợp đồng ' . $contract->code,
				] );

				CollectSpend::create( [
					'amount'         => $data['deposit'],
					'hostel_id'      => $hostelId,
					'room_id'        => $roomId,
					'note'           => 'Thu tiền đặt cọc Hợp đồng ' . $contract->code,
					'payment_method' => CollectSpend::MONEY,
					'date_action'    => ! empty( $dateContractCarbon ) ? $dateContractCarbon->copy()->toDateString() : Carbon::now()->toDateString(),
					'type'           => CollectSpend::COLLECT,
					'name'           => 'Thu tiền đặt cọc Hợp đồng ' . $contract->code,
					'transaction_id' => $transaction->id,
					'contract_id'    => $contract->id,
					'is_deposit'     => true,
				] );
			}

			$check = User::query()->where( 'phone', $data['phone'] )->where( 'type', User::RENTER )->first();


			$data['type']             = User::RENTER;
			$data['first_add_renter'] = true;

			$image = null;

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

				$data['birthday'] = $birthday;
			}


			if ( $check ) {
				$check->update( $data );
				$user = $check;
			} else {
				if ( isset( $data['customer_image'] ) ) {
					$data['image'] = $data['customer_image'];
				}
				$data['password'] = \Hash::make( '123456' );
				$user             = User::create( $data );
				unset( $data['password'] );
				unset( $data['image'] );
			}

			$checkRenter = RenterRoom::query()->where( 'user_id', $user->id )->where( 'room_id', $data['room_id'] )->count();

			if ( $checkRenter == 0 ) {
				RenterRoom::create( [
					'user_id'            => $user->id,
					'room_id'            => $data['room_id'],
					'hostel_id'          => $hostelId,
					'type_rent'          => $hostel->type_rent,
					'contract_id'        => $contract->id,
					'date_joined'        => $data['date_join'],
					'residence_status'   => $data['residence_status'],
					'date_end_residence' => $data['date_end_residence'],
					'bed_id'             => $data['bed_id'],
				] );

				Renter::create( [
					'image'              => $image,
					'name'               => $user->name,
					'room_id'            => $data['room_id'],
					'note'               => isset( $data['note'] ) ? $data['note'] : '',
					'hostel_id'          => $hostelId,
					'room_name'          => $room->name,
					'hostel_name'        => $hostel->name,
					'address'            => isset( $data['address'] ) ? $data['address'] : '',
					'province_id'        => isset( $data['province_id'] ) ? $data['province_id'] : '',
					'district_id'        => isset( $data['district_id'] ) ? $data['district_id'] : '',
					'ward_id'            => isset( $data['ward_id'] ) ? $data['ward_id'] : '',
					'date_joined'        => $data['date_join'],
					'birthday'           => $birthday,
					'phone'              => $data['phone'],
					'status'             => Renter::LIVING,
					'user_id'            => $user->id,
					'residence_status'   => $data['residence_status'],
					'date_end_residence' => $data['date_end_residence'],
					'id_number_front'    => isset( $data['id_number_front'] ) ? $data['id_number_front'] : null,
					'id_number_back'     => isset( $data['id_number_back'] ) ? $data['id_number_back'] : null,
					'id_number_location' => isset( $data['id_number_location'] ) ? $data['id_number_location'] : null,
					'id_number_date'     => isset( $data['id_number_date'] ) ? $data['id_number_date'] : null,
//                    'residence_status' => $data['residence_status'],
//                    ''
				] );
			}


			$contract->update( [
				'renter_id' => $user->id
			] );

			if ( $room ) {
				$currentRenter         = Functions::getUserForRoom( $room );
				$room->date_available  = null;
				$room->is_start_remind = false;
				$room->current_renter  = $currentRenter->id;
				$room->save();
			}

			\DB::table( 'room_logs' )->insert( [
				'content'    => 'Thêm người ở trọ ' . $user->name,
				'room_id'    => $data['room_id'],
				'created_at' => Carbon::now()->toDateTimeString(),
				'updated_at' => Carbon::now()->toDateTimeString()
			] );

			Functions::updateNumberEmptyRoom( $hostel );
			$period = Functions::getPeriodNumber( $data['period'] );
			//Sinh hoa don
			$dayCollect = $data['day_collect'];
			$lastEnd    = null;

			$from = Carbon::createFromFormat( 'Y-m-d', $data['date_enable'] );

			$target          = Carbon::now();
			$cost            = $data['room_price'];
			$periodMoney     = $period;
			$collectToCarbon = null;

			$fees = $data['fees'];
			if ( ! empty( $fees ) ) {
				$contract->fees()->sync( $fees );
			}

			Functions::updateIsEmptyRoom( $room );

			if ( $data['room_price'] <= 0 ) {
				\DB::commit();

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

			if ( isset( $data['is_collected'] ) ) {
				if ( $data['is_collected'] == 'on' ) {
					$collectTo = $data['collect_to'];
					if ( ! empty( $collectTo ) ) {

						$collectToCarbon = Carbon::createFromFormat( 'Y-m-d', $collectTo );
						if ( $target->lessThan( $collectToCarbon ) ) {
							$target = $collectToCarbon->copy();
						}

						$contract->update( [
							'is_collected' => true,
							'collect_to'   => $collectToCarbon->toDateString()
						] );
					}
				}
			}
			//	var_dump($collectToCarbon->toDateString()); die();
            if (!empty($target)) {
                while ($from->lessThanOrEqualTo($target)) {
                    if ($period > 1) {
                        $month = $from->copy()->firstOfMonth()->addMonth($period - 1)->month;
                        $year = $from->copy()->firstOfMonth()->addMonth($period - 1)->year;
                        if ($dayCollect <= $from->copy()->day) {
                            $month = $from->copy()->firstOfMonth()->addMonth($period)->month;
                            $year = $from->copy()->firstOfMonth()->addMonth($period)->year;
                        }
                    } else {
                        $month = $from->copy()->month;
                        $year = $from->copy()->year;
                        if ($dayCollect <= $from->copy()->day) {
                            $month = $from->copy()->firstOfMonth()->addMonth()->month;
                            $year = $from->copy()->firstOfMonth()->addMonth()->year;
                        }
                    }

                    $isValid = true;
                    if (checkdate($month, $dayCollect, $year)) {
                        $to = Carbon::createFromFormat('d-m-Y', $dayCollect . '-' . $month . '-' . $year);
                    } else {
                        $isValid = false;
                        $tempDayCollect = Carbon::createFromFormat('d-m-Y', '01-' . $month . '-' . $year)->lastOfMonth()->day;
                        $to = Carbon::createFromFormat('d-m-Y', $tempDayCollect . '-' . $month . '-' . $year);
                    }
                    //dump( $from->toDateString() . '|' . $to->toDateString() );
                    $money = $periodMoney * $cost;
                    $sumMoney = $money;
                    $isCollect = true;

                    if ($isValid == true) {
                        if (!empty($collectToCarbon)) {

                            if ($collectToCarbon->greaterThanOrEqualTo($from->copy()) && $collectToCarbon->lessThan($to->copy())) {

                                if ($period > 1) {
                                    $money = Functions::calculateMoneyInRange2($from->copy(), $to->copy(), $dayCollect, $period, $cost, $collectToCarbon);

                                } else {
                                    if (!Functions::checkFullPeriod($from->copy(), $to->copy(), $dayCollect)) {
                                        $diffDays = $collectToCarbon->copy()->diffInDays($from->copy());
                                        $numberDays = 30;
                                        $money = intval($cost / ($numberDays) * ($diffDays + 1));
                                    } else {
                                        if ($to->copy()->day == $dayCollect && $from->copy()->subDay(1)->month == 2) {
//										$numberMonth = $from->copy()->firstOfMonth()->diffInMonths( $to->copy()->firstOfMonth() );
//										$money       = $cost * $numberMonth;
                                            $money = Functions::calculateMoneyInRange2($from->copy(), $to->copy(), $dayCollect, $period, $cost, $collectToCarbon);
                                        } else {
                                            $diffDays = $collectToCarbon->copy()->diffInDays($from->copy());
                                            $numberDays = $from->copy()->daysInMonth;

                                            //$money = intval( $cost / ( $numberDays + 1 ) * ( $diffDays + 1 ) );
                                            $money = Functions::calculateMoneyInRange2($from->copy(), $to->copy(), $dayCollect, $period, $cost, $collectToCarbon);
                                        }
                                    }
                                }

                            } else if ($collectToCarbon->greaterThan($to->copy())) {

                                if ($period > 1) {
                                    $money = Functions::calculateMoneyInRange2($from->copy(), $to->copy(), $dayCollect, $period, $cost, $collectToCarbon);
                                } else {

                                    if ($from->copy()->day != $to->copy()->day) {
                                        // dump($from->copy()->toDateString());
                                        // dump($to->copy()->toDateString());
                                        // dump('--');
                                        if (Functions::checkFullPeriod($from->copy(), $to->copy(), $dayCollect)) {
                                            $money = $periodMoney * $cost;
                                        } else {
                                            $diffDays = $to->copy()->diffInDays($from->copy());
                                            $numberDays = 30;
                                            $money = intval($cost / ($numberDays) * ($diffDays + 1));
                                        }
                                        //  dump($money);
                                    } else {
                                        $money = $periodMoney * $cost;
                                    }
                                }
                            } else if ($collectToCarbon->equalTo($to->copy())) {
                                if ($period > 1) {
                                    if (Functions::checkFullPeriod($from->copy(), $to->copy(), $dayCollect)) {
                                        $money = $periodMoney * $cost;
                                    } else {
                                        $money = Functions::calculateMoneyInRange2($from->copy(), $to->copy(), $dayCollect, $period, $cost, $collectToCarbon);
                                    }
                                } else {
                                    if (Functions::checkFullPeriod($from->copy(), $to->copy(), $dayCollect)) {
                                        $money = $periodMoney * $cost;
                                    } else {

                                        $diffDays = $to->copy()->diffInDays($from->copy());
                                        $numberDays = 30;
                                        $money = intval($cost / ($numberDays) * ($diffDays + 1));
                                    }
                                }
                            } else {
                                $money = 0;
                            }
                        } else {
                            $money = Functions::calculateMoneyInRange4($from->copy(), $to->copy(), $cost, $dayCollect);
                            $isCollect = false;
                        }
                    } else {

                        if (!empty($collectToCarbon)) {
                            if ($collectToCarbon->greaterThan($to->copy())) {
                                if ($period > 1) {
                                    if (Functions::checkFullPeriod($from->copy(), $to->copy(), $dayCollect)) {
                                        $money = $periodMoney * $cost;
                                    } else {
                                        $money = Functions::calculateMoneyInRange2($from->copy(), $to->copy(), $dayCollect, $period, $cost, $collectToCarbon);
                                    }
                                } else {
                                    if (Functions::checkFullPeriod($from->copy(), $to->copy(), $dayCollect)) {
                                        $money = $periodMoney * $cost;
                                    } else {


                                        $diffDays = $to->copy()->diffInDays($from->copy());
                                        $numberDays = 30;
                                        $money = intval($cost / ($numberDays) * ($diffDays + 1));
                                    }
                                }

                            } else if ($collectToCarbon->lessThan($from->copy())) {
                                $money = 0;
                            } else {
                                if ($period > 1) {

                                    $money = Functions::calculateMoneyInRange2($from->copy(), $to->copy(), $dayCollect, $period, $cost, $collectToCarbon);
                                } else {


                                    if (Functions::checkFullPeriod($from->copy(), $to->copy(), $dayCollect)) {

                                        if ($period > 1) {

                                            $money = Functions::calculateMoneyInRange2($from->copy(), $to->copy(), $dayCollect, $period, $cost, $collectToCarbon);
                                        } else {
                                            $diffDays = $collectToCarbon->copy()->diffInDays($from->copy());
                                            $numberDays = $from->copy()->diffInDays($to->copy());

                                            $money = Functions::calculateMoneyInRange2($from->copy(), $to->copy(), $dayCollect, $period, $cost, $collectToCarbon);
                                        }
                                    } else {
                                        if ($period > 1) {
                                            $money = Functions::calculateMoneyInRange2($from->copy(), $to->copy(), $dayCollect, $period, $cost, $collectToCarbon);
                                        } else {
                                            $diffDays = $to->copy()->diffInDays($from->copy());
                                            $numberDays = 30;
                                            $money = intval($cost / ($numberDays) * ($diffDays + 1));
                                        }
                                    }
                                }
                            }
                        } else {
                            $money = Functions::calculateMoneyInRange4($from->copy(), $to->copy(), $cost, $dayCollect);
                            $isCollect = false;
                        }
                    }

                    if (!Functions::checkFullPeriod($from->copy(), $to->copy(), $dayCollect)) {
                        $sumMoney = Functions::calculateMoneyInRange4($from->copy(), $to->copy(), $cost, $dayCollect);
                    }

//					if ( $from->copy()->lessThanOrEqualTo( $collectToCarbon ) && $to->greaterThanOrEqualTo( $collectToCarbon ) ) {
//						$sumMoney = $money;
//					}

//					$check = Functions::checkExistDate($hostel, $from->copy(), $to->copy(), $contract, $roomId, $hostelId);
//					// dump($name);
//					var_dump($check);
                    //if ($check == 0) {
                    if (!empty($money)) {
                        $range = round($money / ($cost), 2);
                    } else {
                        $range = round($sumMoney / ($cost), 2);
                    }

                    if ($from->copy()->lessThanOrEqualTo($collectToCarbon) && $to->greaterThanOrEqualTo($collectToCarbon)) {
                        $range = round($sumMoney / ($cost), 2);
                    }
                    $name = 'Thu tiền phòng từ ' . $from->copy()->format('d/m/Y') . ' đến ' . $to->copy()->format('d/m/Y');
//							dump($name);
//							dump($range);
//							//dump($paidMoney);
//							dump($money);

                    if ($money > $sumMoney) {
                        $money = $sumMoney;
                        $range = round($money / ($cost), 2);
                    }

                    //gán lại cái số tiền
                    if ($isCollect == false) {
                        $money = 0;
                    }

                    $moneyInfo = MoneyInfo::create([
                        'hostel_id' => $hostelId,
                        'room_id' => $roomId,
                        'bed_id' => $data['bed_id'],
                        'date_action' => $from->copy()->toDateString(),
                        'contract_id' => $contract->id,
                        'user_id' => $user->id,
                        'type' => MoneyInfo::VOUCHER_CONTRACT,
                        'amount' => $sumMoney,
                        'pay' => $money,
                        'remain' => $sumMoney - $money,
                        'money_info_name' => $name
                    ]);

                    $moneyInfo->update([
                        'name' => 'HD' . $moneyInfo->id . Carbon::now()->format('dmY')
                    ]);

                    MoneyDetail::create([
                        'hostel_id' => $hostelId,
                        'room_id' => $roomId,
                        'name' => $name,
                        'value' => $contract->room_price,
                        'money_info_id' => $moneyInfo->id,
                        'amount' => $money,
                        'note' => $name,
                        'start_date' => $from->copy()->toDateString(),
                        'end_date' => $to->copy()->toDateString(),
                        'qty' => $range,
                        'renter_id' => $contract->renter_id,
                        'sum_amount' => $sumMoney
                    ]);

                    if ($isCollect == true) {

                        $transaction = Transaction::create([
                            'money_info_id' => $moneyInfo->id,
                            'amount' => $money,
                            'note' => $name,
                            'room_id' => $roomId,
                            'hostel_id' => $hostelId,
                            'date_action' => Carbon::now()->toDateString(),
                            'type' => CollectSpend::COLLECT
                        ]);

                        CollectSpend::create([
                            'amount' => $money,
                            'hostel_id' => $hostelId,
                            'room_id' => $roomId,
                            'note' => $name,
                            'payment_method' => CollectSpend::MONEY,
                            'date_action' => $from->copy()->toDateString(),
                            'user_id' => $contract->renter_id,
                            'money_info_id' => $moneyInfo->id,
                            'type' => CollectSpend::COLLECT,
                            'transaction_id' => $transaction->id
                        ]);
                    }


                    //}

//					$returnArr[] = [
//						'start_date' => $from->format( 'd/m/Y' ),
//						'end_date'   => $to->format( 'd/m/Y' ),
//						'money'      => $money,
//						'sum'        => $sumMoney
//					];

                    $from = $to->copy()->addDay();
                    $lastEnd = $to->copy();
                }
            }

            if (!empty($lastEnd)) {
//	        dump($lastEnd);
//	        dump(Carbon::now());

                if ($lastEnd->copy()->startOfDay()->equalTo(Carbon::now()->startOfDay())) {

                    $lastEnd->addDay(1);
                    if ($period > 1) {
                        $month = $lastEnd->copy()->firstOfMonth()->addMonth($period - 1)->month;
                        $year = $lastEnd->copy()->firstOfMonth()->addMonth($period - 1)->year;
                        if ($dayCollect <= $lastEnd->copy()->day) {
                            $month = $lastEnd->copy()->firstOfMonth()->addMonth($period)->month;
                            $year = $lastEnd->copy()->firstOfMonth()->addMonth($period)->year;
                        }
                    } else {
                        $month = $lastEnd->copy()->month;
                        $year = $lastEnd->copy()->year;
                        if ($dayCollect <= $lastEnd->copy()->day) {
                            $month = $lastEnd->copy()->firstOfMonth()->addMonth()->month;
                            $year = $lastEnd->copy()->firstOfMonth()->addMonth()->year;
                        }
                    }
                    if (checkdate($month, $dayCollect, $year)) {

                        $to2 = Carbon::createFromFormat('d-m-Y', $dayCollect . '-' . $month . '-' . $year);

                    } else {
                        $tempDayCollect = Carbon::createFromFormat('d-m-Y', '01-' . $month . '-' . $year)->lastOfMonth()->day;
                        $to2 = Carbon::createFromFormat('d-m-Y', $tempDayCollect . '-' . $month . '-' . $year);
                    }

//	            $money2 = $cost * $period;
//	            if(!Functions::checkFullPeriod($lastEnd->copy(), $to2->copy(), $dayCollect))
//	            {
//	            	$money2 = Functions::calculateMoneyInRange3($lastEnd->copy(), $to2->copy(), $dayCollect);
//	            }


                    $name = 'Thu tiền phòng từ ' . $from->copy()->format('d/m/Y') . ' đến ' . $to2->copy()->format('d/m/Y');
//                    dump('---');
//							dump($name);
//							dump($period);
//							//dump($paidMoney);
//							dump($money);
                    $moneyInfo = MoneyInfo::create([
                        'hostel_id' => $hostelId,
                        'room_id' => $roomId,
                        'bed_id' => $data['bed_id'],
                        'date_action' => $from->copy()->toDateString(),
                        'contract_id' => $contract->id,
                        'user_id' => $user->id,
                        'type' => MoneyInfo::VOUCHER_CONTRACT,
                        'amount' => $period * $cost,
                        'pay' => 0,
                        'remain' => $period * $cost,
                        'money_info_name' => $name
                    ]);

                    $moneyInfo->update([
                        'name' => 'HD' . $moneyInfo->id . Carbon::now()->format('dmY')
                    ]);

                    MoneyDetail::create([
                        'hostel_id' => $hostelId,
                        'room_id' => $roomId,
                        'name' => $name,
                        'value' => $contract->room_price,
                        'money_info_id' => $moneyInfo->id,
                        'amount' => 0,
                        'note' => $name,
                        'start_date' => $lastEnd->copy()->toDateString(),
                        'end_date' => $to2->copy()->toDateString(),
                        'qty' => $period,
                        'renter_id' => $contract->renter_id,
                        'sum_amount' => $period * $cost
                    ]);

//					$returnArr[] = [
//						'start_date' => $lastEnd->format('d/m/Y'),
//						'end_date' => $to2->format('d/m/Y'),
//						'money' => 0,
//						'sum' =>  $cost*$period
//					];
                }
            }

            //xử lý case tương lai

            $from2 = Carbon::createFromFormat('Y-m-d', $data['date_enable']);
            if ($from2->copy()->startOfDay()->greaterThan($target->copy()->startOfDay())) {
                if ($period > 1) {
                    $month = $from2->copy()->firstOfMonth()->addMonth($period - 1)->month;
                    $year = $from2->copy()->firstOfMonth()->addMonth($period - 1)->year;
                    if ($dayCollect <= $from2->copy()->day) {
                        $month = $from2->copy()->firstOfMonth()->addMonth($period)->month;
                        $year = $from2->copy()->firstOfMonth()->addMonth($period)->year;
                    }
                } else {
                    $month = $from2->copy()->month;
                    $year = $from2->copy()->year;
                    if ($dayCollect <= $from2->copy()->day) {
                        $month = $from2->copy()->firstOfMonth()->addMonth()->month;
                        $year = $from2->copy()->firstOfMonth()->addMonth()->year;
                    }
                }
                if (checkdate($month, $dayCollect, $year)) {

                    $to3 = Carbon::createFromFormat('d-m-Y', $dayCollect . '-' . $month . '-' . $year);

                } else {
                    $tempDayCollect = Carbon::createFromFormat('d-m-Y', '01-' . $month . '-' . $year)->lastOfMonth()->day;
                    $to3 = Carbon::createFromFormat('d-m-Y', $tempDayCollect . '-' . $month . '-' . $year);
                }

                if ($period > 1) {
                    $money = $periodMoney * $cost;
                } else {

                    if ($from2->copy()->day != $to3->copy()->day) {
                        // dump($from->copy()->toDateString());
                        // dump($to->copy()->toDateString());
                        // dump('--');
                        if (Functions::checkFullPeriod($from2->copy(), $to3->copy(), $dayCollect)) {
                            $money = $period * $cost;
                        } else {
                            $diffDays = $to3->copy()->diffInDays($from2->copy());
                            $numberDays = 30;
                            $money = intval($cost / ($numberDays) * ($diffDays + 1));
                            $money = Functions::calculateMoneyInRange4($from2->copy(), $to3->copy(), $cost, $dayCollect);
                        }
                        //  dump($money);
                    } else {
                        $money = $periodMoney * $cost;
                    }
                }

                $range = $period;
                if (!empty($money)) {
                    $range = round($money / ($periodMoney * $cost), 2);
                }

                if (empty($money)) {
                    $money = $periodMoney * $cost;
                }

                $name = 'Thu tiền phòng từ ' . $from2->copy()->format('d/m/Y') . ' đến ' . $to3->copy()->format('d/m/Y');
//                    dump('---');
//							dump($name);
//							dump($period);
//							//dump($paidMoney);
//							dump($money);
                $moneyInfo = MoneyInfo::create([
                    'hostel_id' => $hostelId,
                    'room_id' => $roomId,
                    'bed_id' => $data['bed_id'],
                    'date_action' => $from2->copy()->toDateString(),
                    'contract_id' => $contract->id,
                    'user_id' => $user->id,
                    'type' => MoneyInfo::VOUCHER_CONTRACT,
                    'amount' => $money,
                    'pay' => 0,
                    'remain' => $money,
                    'money_info_name' => $name
                ]);

                $moneyInfo->update([
                    'name' => 'HD' . $moneyInfo->id . Carbon::now()->format('dmY')
                ]);

                MoneyDetail::create([
                    'hostel_id' => $hostelId,
                    'room_id' => $roomId,
                    'name' => $name,
                    'value' => $contract->room_price,
                    'money_info_id' => $moneyInfo->id,
                    'amount' => 0,
                    'note' => $name,
                    'start_date' => $from2->copy()->toDateString(),
                    'end_date' => $to3->copy()->toDateString(),
                    'qty' => $range,
                    'renter_id' => $contract->renter_id,
                    'sum_amount' => $money
                ]);

//	            $money2 = $cost * $period;
//	            if(!Functions::checkFullPeriod($lastEnd->copy(), $to2->copy(), $dayCollect))
//	            {
//	            	$money2 = Functions::calculateMoneyInRange3($lastEnd->copy(), $to2->copy(), $dayCollect);
//	            }

//                $returnArr[] = [
//                    'start_date' => $from2->format('d/m/Y'),
//                    'end_date' => $to3->format('d/m/Y'),
//                    'money' => $money,
//                    'sum' => $money
//                ];
            }


            //	var_dump($returnArr); die();

			//die();


//              dd();


			return [
				'status' => 1
			];

		} catch ( \Exception $exception ) {

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

			dd( $exception->getTraceAsString() );

			//var_dump($exception->getMessage() . '|' . $exception->getLine()); die();

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