<?php

namespace App\Http\Controllers\Backend;

use App\Components\Functions;
use App\Models\Order;
use App\Models\UserPackage;
use Carbon\Carbon;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Yajra\Datatables\Datatables;

class OrderController extends AdminController
{
    //
    public function index(Request $request)
    {
        return view('admin.order.list');
    }

    public function getOrderByAttribute(Request $request)
    {
        $startDate = $request->input('start_date');
        $endDate = $request->input('end_date');
        $items = Order::selectRaw('orders.*, packages.name as package_name')
            ->leftJoin('packages', 'orders.package_id', '=', 'packages.id');

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

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

        $isStat = $request->input('is_stat');
        if ($isStat == 1) {
            $itemsProcessed = clone $items;
            $itemsProcessing = clone $items;
            $itemsDropped = clone $items;

            $amountProcessed = $itemsProcessed->where('orders.status', Order::PROCESSED)->sum('value');
            $amountProcessing = $itemsProcessing->where('orders.status', Order::PROCESSING)->sum('value');
            $amountDropped = $itemsDropped->where('orders.status', Order::DROPPED)->sum('value');
            $sum = $amountDropped + $amountProcessing + $amountProcessed;

            return response([
                'status' => 1,
                'data' => view('admin.order.stat', compact('sum', 'amountProcessing', 'amountProcessed', 'amountDropped'))->render()
            ]);
        }

        return Datatables::of($items)
            ->addIndexColumn()
            ->editColumn('value', function ($item) {
                if (is_numeric($item->value)) {
                    return number_format($item->value, 0, '.', '.');
                }

                return $item->value;
            })
            ->editColumn('status', function ($item) {
                return '<div style="width: 160px">' . $item->status_text . '</div>';
            })
            ->editColumn('created_at', function ($item) {
                return $item->created_at->format('d/m/Y H:i');
            })
            ->editColumn('name', function ($item) {
                return '<div style="width: 180px">' . $item->name . '</div>';
            })
            ->editColumn('package_name', function ($item) {
                return '<div style="width: 160px">' . $item->package_name . '</div>';
            })
            ->editColumn('payment_type', function ($item) {
                return $item->payment_type_text;
            })
            ->addColumn('action', function ($item) {
                return '<a data-id="' . $item->id . '" href="#edit" data-toggle="modal" class="btn btn-sm btn-outline btn-editable btn-edit-order purple"><i class="fa fa-edit"></i> Cập nhật</a>';
            })
            ->make(true);
    }

    public function edit($id, Request $request)
    {
        $order = Order::find($id);
        if (!$order) {
            return response([
                'status' => 0,
                'message' => 'Dữ liệu không hợp lệ'
            ]);
        }

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

    public function update(Request $request)
    {
        $data = $request->all();
        $id = $data['id'];
        $order = Order::find($id);
        if (!$order) {
            return response([
                'status' => 0,
                'message' => 'Dữ liệu không hợp lệ'
            ]);
        }

        $status = $data['status'];
        $currentStatus = $order->status;
        if ($currentStatus == Order::PROCESSED) {
            return response([
                'status' => 2,
                'message' => 'Đơn hàng đã được xử lý, không thể chuyển trạng thái'
            ]);
        }

        if ($currentStatus == Order::DROPPED) {
            return response([
                'status' => 2,
                'message' => 'Đơn hàng đã bị hủy, không thể chuyển trạng thái'
            ]);
        }

        try {
            \DB::beginTransaction();
            $order->update($data);
            if ($status == Order::PROCESSED) {
                $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);
            }
            \DB::commit();
        } catch (\Exception $exception) {
            \DB::rollBack();
            //  dd($exception->getTraceAsString());
            return response([
                'status' => 0,
                'message' => 'Có lỗi xảy ra vui lòng thử lại sau'
            ]);
        }

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

    public function updateStatusOrder(Request $request)
    {

    }
}
