<?php

namespace App\Console\Commands;

use App\Components\Functions;
use App\Models\CollectSpend;
use App\Models\Contract;
use App\Models\HostelFee;
use App\Models\MoneyDetail;
use App\Models\MoneyInfo;
use App\Models\Transaction;
use App\User;
use Carbon\Carbon;
use Illuminate\Console\Command;
use Spatie\Activitylog\Models\Activity;

class GenerateMoneyInfoContract extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'generate:money-info-contract';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        //
       // $contractId = 21849;

        $contracts = Contract::query()->where('hostel_id', 10741)->orderBy('id', 'desc')->get();

//        foreach ($contracts as $contract)
//        {
//            $items = Activity::query()
//                ->where('subject_id', $contract->id)
//                ->latest()
//                ->first();
//
//            $props = $items->properties;
//            $contract->update($props['old']);
//
//        }
//        dd();

        foreach ($contracts as $contract)
        {
            $contractId = $contract->id;
            $moneyInfos = MoneyInfo::query()
                ->whereIn('type', [
                    MoneyInfo::VOUCHER_CONTRACT,
                    MoneyInfo::VOUCHER_ROOM_PRICE
                ])
                ->where('contract_id', $contractId)
                ->delete();
            // dd($moneyInfos->count());


            $contract = Contract::find($contractId);

            $dateContractCarbon = Carbon::createFromFormat('d/m/Y', '01/07/2020');

            $data = $contract->toArray();
            $data['date_contract'] = $dateContractCarbon;
            $data['date_enable'] = $data['date_contract'];
            $data['start_date'] = $data['date_contract'];
            $data['date_join'] = $data['date_contract'];

            $contract->update($data);




            $data = $contract->toArray();
            $data['date_enable'] = $dateContractCarbon->copy()->format('Y-m-d');
            $period = Functions::getPeriodNumber($contract->period);
            $hostelId = $data['hostel_id'];
            $roomId = $data['room_id'];
            $dayCollect = $data['day_collect'];
            $lastEnd = null;


            $from = $dateContractCarbon->copy();

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

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

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

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

//                    $contract->update([
//                        'is_collected' => true,
//                        'collect_to' => $collectToCarbon->toDateString()
//                    ]);
                }
            }
            //	var_dump($collectToCarbon->toDateString()); die();

            try {
                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
//                ];
                }
            } catch (\Exception $exception)
            {
                dump($exception->getMessage());
                dd($exception->getTraceAsString());
            }
        }




    }
}
