<?php

namespace App\Http\Controllers\Frontend;

use App\Components\Functions;
use App\Models\Coupon;
use App\Models\Order;
use App\Models\Package;
use App\Models\UserPackage;
use App\User;
use Carbon\Carbon;
use Dompdf\Exception;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class PaymentController extends Controller
{
    //
    public function index()
    {
        if (!auth('backend')->check()) {
            return redirect()->back()->with('error', 'Bạn phải đăng nhập để sử dụng chức năng này');
        }
        $packages = Package::where('number_hostels', '<>', 0);
        $currentPackage = UserPackage::where('user_id', auth('backend')->user()->id)->first();

        $minRoom = 20;

        if ($currentPackage) {
            $packageId = $currentPackage->package_id;
            $package = Package::find($packageId);
            if ($package) {
                $minRoom = $package->number_rooms;
            }

            $packages = $packages->where('id', '>=', $packageId);
        }

        $packages = $packages->get();

        return view('frontend3.payment', compact('packages', 'currentPackage', 'minRoom'));
    }

    public function ipn(Request $request)
    {
        $orderId = $request->input('vnp_TxnRef');
        $secureHash = $request->input('vnp_SecureHash');
        $resultCode = $request->input('vnp_ResponseCode');
        $returnData = [];

//        if ($resultCode != '00') {
//            return redirect()->to(url('/?s=2'))->with('error', 'Có lỗi xảy ra khi thanh toán, vui lòng liên hệ với SĐT: 0868.987.355, mã đơn hàng ' . $orderId);
//        }

        $check = Functions::validateSecureHash($secureHash, $request->all());
        if (!$check) {
            $returnData = [
                'RspCode' => '97',
                'Message' => 'Chu ky khong hop le'
            ];
            return response($returnData);
        }

        $order = Order::find($orderId);

        if (!$order) {
            $returnData = [
                'RspCode' => '01',
                'Message' => 'Order not found'
            ];
            return response($returnData);
        }

        if ($order->status == Order::PROCESSED) {
            $returnData = [
                'RspCode' => '02',
                'Message' => 'Order already confirmed'
            ];
            return response($returnData);
        }

        try {
            \DB::beginTransaction();

            $order->vnpay_status = $resultCode;
            $order->save();

            if ($resultCode === '00') {

                $order->status = Order::PROCESSED;
                $order->save();

                if(empty($order->number_view_leads)) {

	                $packageId  = $order->package_id;
	                $extraMonth = $order->month;

	                $currentPackage = UserPackage::where( 'user_id', $order->user_id )->first();
	                if ( $currentPackage ) {
		                if ( ! empty( $packageId ) ) {

			                if ( $currentPackage->package_id < $packageId ) {

				                $currentPackage->package_id = $packageId;
			                }
		                }

		                $currentPackage->end_date = $currentPackage->end_date->addMonth( $extraMonth );
		                $currentPackage->save();
	                }

	                Functions::redeemCoupon( $order->coupon_code, $order->user_id, $isOrder = true );
                } else {
                	User::query()->where('id', $order->user_id)
		                ->increment('number_view_leads', $order->number_view_leads);
                }


            }

            \DB::commit();

            $returnData = [
                'RspCode' => '00',
                'Message' => 'Confirm Success'
            ];

            return response($returnData);

        } catch (\Exception $exception) {
            \DB::rollBack();
            //  dd($exception->getTraceAsString());
            $returnData = [
                'RspCode' => '99',
                'Message' => 'Unknow error'
            ];

            return response($returnData);
        }


    }

    public function callbackOrder(Request $request)
    {
        $orderId = $request->input('vnp_TxnRef');
        $secureHash = $request->input('vnp_SecureHash');
        $resultCode = $request->input('vnp_ResponseCode');
        if ($resultCode != '00') {
            return redirect()->to(url('/?s=2'))->with('error', 'Có lỗi xảy ra khi thanh toán, vui lòng liên hệ với SĐT: 0868.987.355, mã đơn hàng ' . $orderId);
        }

        $check = Functions::validateSecureHash($secureHash, $request->all());
        if (!$check) {
            return redirect()->to(url('/?s=2'))->with('error', 'Dữ liệu không hợp lệ');
        }

        $order = Order::find($orderId);

        if (!$order) {
            return redirect()->to(url('/?s=2'))->with('error', 'Dữ liệu không hợp lệ');
        }

//        if($order->status == Order::PROCESSED)
//        {
//            return redirect()->to(url('/?s=2'))->with('error', 'Đơn hàng đã được xử lý trước đó');
//        }


        return redirect()->to(url('/?s=1'))->with('success', 'Thanh toán đơn hàng thành công. Mã đơn hàng: ' . $order->id);
    }

    public function processOrder(Request $request)
    {
        $data = $request->all();
        $coupon = $request->input('coupon_code');
        $packageId = $request->input('package_id');
        $month = $request->input('month', 1);
        $paymentType = $request->input('payment_type');
        $room = $request->input('room');

        $package = Package::find($packageId);

        if (!$package) {
            return response([
                'status' => 0,
                'message' => 'Dữ liệu không hợp lệ'
            ]);
        }

        if (empty($room)) {
            return response([
                'status' => 0,
                'message' => 'Không được bỏ trống số phòng'
            ]);
        }

        $currentPackage = UserPackage::where('user_id', auth('backend')->user()->id)->first();
        if ($currentPackage) {
            if (!empty($packageId)) {

                if ($currentPackage->package_id > $packageId) {

                    return response([
                        'status' => 0,
                        'message' => 'Bạn không thể chọn gói thấp hơn gói sử dụng hiện tại'
                    ]);
                }
            }

        }

        $price = $package->price_per_month;
        $sum = $price * $month;

        $roomMore = $room - $package->number_rooms;
        $extra = ($roomMore / 10) * $package->price_10_rooms * $month;

        if ($extra > 0) {
            $sum += $extra;
        }

        $newSum = $sum;
        $couponItem = null;
        $discount = 0;
        $extraMonth = 0;

        if (!empty($coupon)) {

            $check = \DB::table('coupon_generates')->where('code', $coupon)->first();

            if (!$check) {
                return [
                    'status' => 0,
                    'message' => 'Coupon không tồn tại'
                ];
            }

            if ($check->is_active == 0) {
                return [
                    'status' => 0,
                    'message' => 'Coupon chưa được kích hoạt'
                ];
            }

            $couponId = $check->coupon_id;
            $couponItem = Coupon::find($couponId);
            if (!$couponItem) {
                return [
                    'status' => 0,
                    'message' => 'Không tìm thấy mã khuyến mại'
                ];
            }

            if (!empty($couponItem->from_date_expire)) {
                if ($couponItem->from_date_expire->greaterThan(Carbon::now())) {
                    return [
                        'status' => 0,
                        'message' => 'Coupon chưa thể sử dụng'
                    ];
                }
            }

            if (!empty($couponItem->end_date_expire)) {
                if ($couponItem->end_date_expire->lessThan(Carbon::now())) {
                    return [
                        'status' => 0,
                        'message' => 'Coupon đã quá hạn sử dụng'
                    ];
                }
            }

            $extraMonth = $couponItem->number_month_more;
            $discount = 0;

            if ($couponItem->type != 0) {
                if ($couponItem->type == 1) {
                    $discountPercent = $couponItem->percent_reduce;
                    $discount = $discountPercent * $sum / 100;
                    if ($discount > $couponItem->percent_reduce_max) {
                        if (!empty($couponItem->percent_reduce_max)) {
                            $discount = $couponItem->percent_reduce_max;
                        }
                    }
                } else if ($couponItem->type == 2) {
                    $discount = $couponItem->amount_reduce;
                }
            }

            $newSum = $sum - $discount;

            if ($newSum < 0) {
                $newSum = 0;
            }
        }

        $order = Order::create([
            'value' => $sum,
            'package_id' => $packageId,
            'user_id' => auth('backend')->user()->id,
            'name' => auth('backend')->user()->name_text,
            'phone' => auth('backend')->user()->phone,
            'status' => Order::PROCESSING,
            'discount' => $discount,
            'coupon_id' => !empty($couponItem) ? $couponItem->id : null,
            'coupon_code' => $coupon,
            'extra_month' => $extraMonth,
            'month' => $month,
            'rooms' => $room,
            'payment_type' => $paymentType
        ]);

        $url = '';

        if ($paymentType == 1) {
            $url = Functions::buildVnPayUrl($newSum, $request->getClientIp(), null, 'vn', $order->id);
        }

        return response([
            'status' => 1,
            'data' => $url,
            'url' => $url
        ]);

    }

	public function processOrderLead(Request $request)
	{
		$numberViewLead = $request->input('number_view_leads');
		$paymentType = $request->input('payment_type');
		$newSum = $numberViewLead * config('constants.PRICE_PER_VIEW_LEAD');
		$url = '';
		$order = Order::create([
			'value' => $newSum,
			'user_id' => auth('backend')->user()->id,
			'name' => auth('backend')->user()->name_text,
			'phone' => auth('backend')->user()->phone,
			'status' => Order::PROCESSING,
			'payment_type' => $paymentType,
			'number_view_leads' => $numberViewLead
		]);
		if ($paymentType == 1) {
			$url = Functions::buildVnPayUrl($newSum, $request->getClientIp(), null, 'vn', $order->id);
		}
		return response([
			'status' => 1,
			'data' => $url,
			'url' => $url
		]);
	}

    public function getPaymentInfo(Request $request)
    {
        $data = $request->all();
        $packageId = $request->input('package_id');
        $month = $request->input('month', 1);
        $couponCode = $request->input('coupon_code');
        $room = $request->input('room');

        $package = Package::find($packageId);

        if (!$package) {
            return response([
                'status' => 0,
                'message' => 'Dữ liệu không hợp lệ'
            ]);
        }

        if (empty($room)) {
            return response([
                'status' => 0,
                'message' => 'Không được bỏ trống số phòng'
            ]);
        }

        $numberRooms = $package->number_rooms;

        if ($numberRooms % 10 != 0) {
            return response([
                'status' => 0,
                'message' => 'Số phòng phải chia hết cho 10'
            ]);
        }

        $price = $package->price_per_month;
        $sum = $price * $month;

        $roomMore = $room - $package->number_rooms;

        $extra = ($roomMore / 10) * $package->price_10_rooms * $month;

        if ($extra > 0) {
            $sum += $extra;
        }

        return response([
            'status' => 1,
            'data' => view('frontend3.payment_info', compact('sum', 'month', 'package', 'couponCode', 'room'))->render()
        ]);

    }

	public function getPaymentInfoLead(Request $request)
	{
		$numberViewLead = $request->input('number_view_leads');

		return response([
			'status' => 1,
			'data' => view('frontend3.payment_info_lead', compact('numberViewLead'))->render()
		]);

	}

    public function getPaymentCouponInfo(Request $request)
    {
        $coupon = $request->input('coupon_code');

        $packageId = $request->input('package_id');
        $month = $request->input('month', 1);
        $room = $request->input('room');

        $package = Package::find($packageId);

        if (!$package) {
            return response([
                'status' => 0,
                'message' => 'Dữ liệu không hợp lệ'
            ]);
        }

        $price = $package->price_per_month;
        $sum = $price * $month;

        $roomMore = $room - $package->number_rooms;
        $extra = ($roomMore / 10) * $package->price_10_rooms * $month;

        if ($extra > 0) {
            $sum += $extra;
        }

        if (empty($coupon)) {
            return response([
                'status' => 0,
                'message' => 'Không được bỏ trống mã coupon'
            ]);
        }

        $check = \DB::table('coupon_generates')->where('code', $coupon)->first();

        if (!$check) {
            return [
                'status' => 0,
                'message' => 'Coupon không tồn tại'
            ];
        }

        if ($check->is_active == 0) {
            return [
                'status' => 0,
                'message' => 'Coupon chưa được kích hoạt'
            ];
        }

        $couponId = $check->coupon_id;
        $couponItem = Coupon::find($couponId);
        if (!$couponItem) {
            return [
                'status' => 0,
                'message' => 'Không tìm thấy mã khuyến mại'
            ];
        }

        if (!empty($couponItem->from_date_expire)) {
            if ($couponItem->from_date_expire->greaterThan(Carbon::now())) {
                return [
                    'status' => 0,
                    'message' => 'Coupon chưa thể sử dụng'
                ];
            }
        }

        if (!empty($couponItem->end_date_expire)) {
            if ($couponItem->end_date_expire->lessThan(Carbon::now())) {
                return [
                    'status' => 0,
                    'message' => 'Coupon đã quá hạn sử dụng'
                ];
            }
        }
        if($month < $couponItem->minimum_payment_month)
        {
            return [
                'status' => 0,
                'message' => 'Bạn phải thanh toán tối thiểu '.$couponItem->minimum_payment_month.' để áp dụng coupon'
            ];
        }

        $numberUse = $couponItem->number_use;

        $numberUseBefore = \DB::table('log_coupons')
            ->where('code', $coupon)
            ->count();

        $numberUserInCoupon = \DB::table('log_coupons')
            ->where('coupon_id', $couponItem->id)
            ->count();

        if ($numberUserInCoupon > 1) {
            return [
                'status' => 0,
                'message' => 'Bạn đã tham gia chương trình này trước đó'
            ];
        }

        if ($numberUseBefore >= $numberUse) {
            return [
                'status' => 0,
                'message' => 'Coupon đã được sử dụng trước đó'
            ];
        }

        $packageApply = $couponItem->package_apply;
        $currentPackage = UserPackage::where('user_id', auth('backend')->user()->id)->first();

        if (!empty($packageApply)) {

            if ($currentPackage) {
                $currentPackageId = $currentPackage->package_id;
                $packageApplyArr = json_decode($packageApply, true);

                if (!in_array(-1, $packageApplyArr)) {
                    if (!in_array($currentPackageId, $packageApplyArr)) {
                        return response([
                            'status' => 0,
                            'message' => 'Coupon không áp dụng cho gói cước hiện tại của bạn'
                        ]);

                    }
                }
            }
        }

        $extraMonth = $couponItem->number_month_more;
        $discount = 0;

        if ($couponItem->type != 0) {
            if ($couponItem->type == 1) {
                $discountPercent = $couponItem->percent_reduce;
                $discount = $discountPercent * $sum / 100;
                if ($discount > $couponItem->percent_reduce_max) {
                    if (!empty($couponItem->percent_reduce_max)) {
                        $discount = $couponItem->percent_reduce_max;
                    }
                }
            } else if ($couponItem->type == 2) {
                $discount = $couponItem->amount_reduce;
            }
        }

        $newSum = $sum - $discount;

        if ($newSum < 0) {
            $newSum = 0;
        }

        return response([
            'status' => 1,
            'data' => view('frontend3.payment_voucher', compact('extraMonth', 'discount'))->render(),
            'sum' => view('frontend3.sum', compact('newSum'))->render(),
            'payment_info' => view('frontend3.payment_info', compact('sum', 'month', 'package', 'room'))->render()
        ]);
    }
}
