<?php

namespace App\Console\Commands;

use App\Components\Functions;
use App\Models\CollectSpend;
use App\Models\Contract;
use App\Models\Hostel;
use App\Models\MoneyDetail;
use App\Models\MoneyInfo;
use App\Models\Transaction;
use App\User;
use Carbon\Carbon;
use Illuminate\Console\Command;

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

    /**
     * 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()
    {
        //
        try {
            \DB::beginTransaction();

            $phone = '0909848454';
            $owner = User::where('phone', $phone)
                ->where('type', User::OWNER)
                ->first();
            $hostelArr = Hostel::where('owner_id', $owner->id)->pluck('id')->toArray();

            $moneyInfos = MoneyInfo::whereIn('hostel_id', $hostelArr)
                ->whereIn('type', [MoneyInfo::VOUCHER_CONTRACT, MoneyInfo::VOUCHER_ROOM_PRICE])
                ->get();
            $moneyInfoArrs = $moneyInfos->pluck('id')->toArray();

            CollectSpend::whereIn('money_info_id', $moneyInfoArrs)->delete();
            MoneyDetail::whereIn('money_info_id', $moneyInfoArrs)->delete();
            MoneyInfo::whereIn('id', $moneyInfoArrs)->delete();

            Contract::whereIn('hostel_id', $hostelArr)->update([
                'day_collect' => 31,
                'last_invoice_at' => null,
                'last_invoice_id' => null
            ]);

            $contracts = Contract::whereIn('hostel_id', $hostelArr)->where('status','<>',  Contract::LIQUIDATED)->get();
            $bar = $this->output->createProgressBar($contracts->count());
            foreach ($contracts as $contract) {
                $hostelId = $contract->hostel_id;
                $roomId = $contract->room_id;
                $data = $contract->toArray();
                $period =  $period = Functions::getPeriodNumber($data['period']);
                $dayCollect = 31;
                $lastEnd = null;

                $from = $contract->date_enable;

                $target = Carbon::now();
                $cost = $data['room_price'];
                $periodMoney = $period;
                $collectToCarbon = null;
                if (isset($data['is_collected'])) {
                    if ($data['is_collected'] == 1) {
                        $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;

                        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));
                                            }
                                        }
                                    }

                                } 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) {

                                        $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 = 0;
                            }
                        } 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())) {
//                        if (Functions::checkFullPeriod($from->copy(), $to->copy(), $dayCollect)) {
//                           $money = 0;
//                        } else {
//                            $diffDays = $to->copy()->diffInDays($from->copy());
//                            $numberDays = 30;
//                            $money = intval($cost / ($numberDays) * ($diffDays + 1));
//                        }
                                    $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 = intval($cost / ($numberDays + 1) * ($diffDays + 1));
                                            }
                                        } 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 = 0;
                            }
                        }

//                if($to->copy()->lessThanOrEqualTo(Carbon::now())) {
//
//                    if ($from->copy()->day == $to->copy()->day) {
//                        $money = $periodMoney * $cost;
//                    } else {
//
//                        if ($from->copy()->day != $to->copy()->addDay()->day) {
//                            $diffDays2 = $from->copy()->diffInDays($to->copy());
//                            $sumDays2 = $to->copy()->diffInDays($to->copy()->subMonth($period));
//                            $money = intval($cost / ($sumDays2) * ($diffDays2 + 1));
//                        }
//                    }
//                }

//                if ($money > $sumMoney) {
//                    $money = $sumMoney;
//                }

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

                            $sumMoney = Functions::calculateMoneyInRange3($from->copy(), $to->copy(), $cost, $dayCollect);
                        }

//					$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);
                        }
                        $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);
                        $moneyInfo = MoneyInfo::create([
                            'hostel_id' => $contract->hostel_id,
                            'room_id' => $contract->room_id,
                            'date_action' => $from->copy()->toDateString(),
                            'contract_id' => $contract->id,
                            'user_id' => $contract->renter_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' => $contract->hostel_id,
                            'room_id' => $contract->room_id,
                            '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 ($money > 0) {

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

                            CollectSpend::create([
                                'amount' => $money,
                                'hostel_id' => $contract->hostel_id,
                                'room_id' => $contract->room_id,
                                '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,
                            'date_action' => $from->copy()->toDateString(),
                            'contract_id' => $contract->id,
                            'user_id' => $contract->renter_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
                        ]);


                    }
                }
                $bar->advance();
            }
            \DB::commit();
            $bar->finish();
        } catch (\Exception $exception)
        {
            \DB::rollBack();
            dump($exception->getMessage(). '|' .$exception->getLine());
            dd($exception->getTraceAsString());
        }
    }
}
