<?php

namespace App\Http\Controllers\Backend2;

use App\Components\Functions;
use App\Http\Controllers\Backend\AdminController;
use App\Models\ImportExport;
use App\Models\ImportExportItem;
use App\Models\Item;
use App\Models\ItemType;
use App\Models\Warehouse;
use App\User;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Yajra\Datatables\Datatables;

class WarehouseController extends AdminController
{
    //
    public function index(Request $request)
    {
        $userId = auth('backend')->user()->id;

        if (auth('backend')->user()->type == User::STAFF) {
            $userId = auth('backend')->user()->staff_owner_id;
        }

        Functions::createWarehouseIfEmpty($userId);

        return view('admin2.warehouse.index');
    }

    public function indexItem(Request $request)
    {
        return view('admin2.warehouse.item');
    }

    public function indexItemType(Request $request)
    {
        return view('admin2.warehouse.item_type_index');
    }

    public function indexIe(Request $request)
    {
        return view('admin2.warehouse.index_ie');
    }

    public function indexIeItem(Request $request)
    {
        $ieId = $request->input('id');
        return response([
            'status' => 1,
            'data' => view('admin2.warehouse.ie_item', compact('ieId'))->render()
        ]);
    }

    public function getIeItemByAttribute(Request $request)
    {
        $ieId = $request->input('ie_id');
        $items = ImportExportItem::selectRaw('items.*')
            ->where('import_export_id', $ieId)
            ->join('items', 'import_export_table.item_id', '=', 'items.id');
        return Datatables::of($items)
            ->addIndexColumn()
            ->make(true);
    }

    public function getWarehouseRemainDetail(Request $request)
    {
        $warehouseId = $request->input('warehouse_id');
        return response([
            'status' => 1,
            'data' => view('admin2.warehouse.remain_detail', compact('warehouseId'))->render()
        ]);
    }

    public function getWarehouseRemainDetailByAttribute(Request $request)
    {
        $warehouseId = $request->input('warehouse_id');

        $items = \DB::table('item_warehouses')
            ->selectRaw('SUM(`item_warehouses`.`amount`) as remain, item_types.name as item_type_name')
            ->join('item_types', 'item_warehouses.item_type_id', '=', 'item_types.id')
            ->where('warehouse_id', $warehouseId)
            ->groupBy('item_type_id');

        return Datatables::of($items)
            ->addIndexColumn()
            ->make(true);

    }

    public function getIeByAttribute(Request $request)
    {
        $userId = auth('backend')->user()->id;
        $type = auth('backend')->user()->type;
        if ($type == User::STAFF) {
            $userId = auth('backend')->user()->staff_owner_id;
        }

        $items = ImportExport::query()
            ->where('import_export.owner_id', $userId)

            ->orderBy('import_export.id', 'desc');

        return Datatables::of($items)
            ->addIndexColumn()
            ->editColumn('import', function ($item) {
                if ($item->type == Warehouse::IMPORT) {
                    return '<a href="#ie_items" data-id="' . $item->id . '" data-toggle="modal" class="detail-items">' . $item->import . '</a>';
                }

                return $item->import;
            })

            ->filterColumn('item_type_id', function ($query, $keyword) {
                $query->whereHas('itemType', function ($q) use ($keyword) {
                    $q->where('item_types.name', 'LIKE', '%' . $keyword . '%');
                });
            })
            ->filterColumn('warehouse_id', function ($query, $keyword) {
                $query->whereHas('warehouse', function ($q) use ($keyword) {
                    $q->where('warehouses.name', 'LIKE', '%' . $keyword . '%');
                });
            })

            ->editColumn('item_type_id', function ($item) {
               if($item->itemType)
               {
                   return $item->itemType->name;
               }
            })
            ->editColumn('warehouse_id', function ($item) {
                if($item->warehouse)
                {
                    return $item->warehouse->name;
                }
            })
            ->editColumn('hostel_id', function ($item) {
                if($item->hostel)
                {
                    return $item->hostel->name;
                }
            })
            ->editColumn('room_id', function ($item) {
                if($item->room)
                {
                    return $item->room->name;
                }
            })
            ->editColumn('export', function ($item) {
                if ($item->type == Warehouse::EXPORT) {
                    return '<a href="#ie_items" data-id="' . $item->id . '" data-toggle="modal" class="detail-items">' . $item->export . '</a>';
                }

                return $item->export;
            })
            ->editColumn('type', function ($item) {
                return $item->type_text;
            })
            ->make(true);

    }

    public function createItemView(Request $request)
    {
        $ownerId = auth('backend')->user()->id;

        if (auth('backend')->user()->type == User::STAFF) {
            $ownerId = auth('backend')->user()->staff_owner_id;
        }
        $itemTypes = ItemType::where('owner_id', $ownerId)->get();
        $warehouses = Warehouse::where('owner_id', $ownerId)->get();

        return response([
            'status' => 1,
            'data' => view('admin2.warehouse.create_item', compact('itemTypes', 'warehouses'))->render()
        ]);
    }

    public function createItemTypeView(Request $request)
    {

        return response([
            'status' => 1,
            'data' => view('admin2.warehouse.create_item_type')->render()
        ]);
    }

    public function createItemNumber(Request $request)
    {
        $numbers = $request->input('numbers');
        return response([
            'status' => 1,
            'data' => view('admin2.warehouse.item_codes', compact('numbers'))->render()
        ]);
    }

    public function getItemTypeByAttribute(Request $request)
    {
        $ownerId = auth('backend')->user()->id;

        if (auth('backend')->user()->type == User::STAFF) {
            $ownerId = auth('backend')->user()->staff_owner_id;
        }

        $items = ItemType::query()->where('owner_id', $ownerId)->get();

        return Datatables::of($items)
            ->addIndexColumn()
            ->editColumn('name', function ($item) {
                return '<span class="name_text">' . $item->name . '</span>'
                    . '<input type="text" class="form-control name_input" value="' . $item->name . '" style="display: none">';
            })
            ->editColumn('reference', function ($item) {
                return '<span class="reference_text">' . $item->reference . '</span>'
                    . '<input type="text" class="form-control reference_input" value="' . $item->reference . '" style="display: none">';
            })
            ->addColumn('action', function ($item) {
                $edit = '<a href="#" data-id="' . $item->id . '"class="btn btn-sm btn-outline btn-editable purple btn_edit_item_type" style="float: left"><i class="fa fa-edit"></i> Sửa</a>';
                $delete = '<a data-id="' . $item->id . '" class="btn btn-sm btn-outline btn-editable dark black btn_delete_item_type" style="float: left"><i class="fa fa-trash"></i> Xóa</a>';
                if (auth('backend')->user()->cannot('edit-item-type')) {
                    $edit = null;
                }
                if (auth('backend')->user()->cannot('delete-item-type')) {
                    $delete = null;
                }
                return
                    $edit .
                    '<a href="#" data-id="' . $item->id . '"class="btn btn-sm btn-outline btn-save green btn_save_item_type" style="display: none; float: left"><i class="glyphicon glyphicon-download-alt"></i> Lưu</a>' .
                    '<a href="#" data-id="' . $item->id . '"class="btn btn-sm btn-outline btn-cancel red btn_cancel_item_type" style="display: none; float: left"><i class="glyphicon glyphicon-remove-sign"></i> Hủy</a>' .
                    $delete;

            })
            ->make(true);
    }

    public function getItemByAttribute(Request $request)
    {
        $ownerId = auth('backend')->user()->id;

        if (auth('backend')->user()->type == User::STAFF) {
            $ownerId = auth('backend')->user()->staff_owner_id;
        }

        $items = Item::query()->where('owner_id', $ownerId);
        return Datatables::of($items)
            ->addIndexColumn()
            ->editColumn('name', function ($item) {
                return '<span class="name_text">' . $item->name . '</span>'
                    . '<input type="text" class="form-control name_input" value="' . $item->name . '" style="display: none">';
            })
            ->editColumn('reference', function ($item) {
                return '<span class="reference_text">' . $item->reference . '</span>'
                    . '<input type="text" class="form-control reference_input" value="' . $item->reference . '" style="display: none">';
            })
            ->editColumn('price', function ($item) {
                return '<span class="price_text">' . $item->price . '</span>'
                    . '<input type="text" class="form-control price_input" value="' . $item->price . '" style="display: none">';
            })
            ->editColumn('status', function ($item) {
                return '<span class="status_text">' . $item->status . '</span>'
                    . '<input type="text" class="form-control status_input" value="' . $item->status . '" style="display: none">';
            })
            ->addColumn('action', function ($item) {
                $edit = '<a href="#" data-id="' . $item->id . '"class="btn btn-sm btn-outline btn-editable purple btn_edit_item" style="float: left"><i class="fa fa-edit"></i> Sửa</a>';
                $delete = '<a data-id="' . $item->id . '" class="btn btn-sm btn-outline btn-editable dark black btn_delete_item" style="float: left"><i class="fa fa-trash"></i> Xóa</a>';
                if (auth('backend')->user()->cannot('edit-item')) {
                    $edit = null;
                }
                if (auth('backend')->user()->cannot('delete-item')) {
                    $delete = null;
                }

                return
                    $edit .
                    '<a href="#" data-id="' . $item->id . '"class="btn btn-sm btn-outline btn-save green btn_save_item" style="display: none; float: left"><i class="glyphicon glyphicon-download-alt"></i> Lưu</a>' .
                    '<a href="#" data-id="' . $item->id . '"class="btn btn-sm btn-outline btn-cancel red btn_cancel_item" style="display: none; float: left"><i class="glyphicon glyphicon-remove-sign"></i> Hủy</a>' .
                    $delete;
            })
            ->make(true);
    }

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

        $item->update( $data );

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

    public function storeItemType(Request $request)
    {
        if (auth('backend')->user()->cannot('add-item-type')) {
            abort(403);
        }
        $ownerId = auth('backend')->user()->id;

        if (auth('backend')->user()->type == User::STAFF) {
            $ownerId = auth('backend')->user()->staff_owner_id;
        }

        $data = $request->all();
        $data['owner_id'] = $ownerId;
        $data['code'] = 'ITT-' . uniqid();
        ItemType::create($data);
        return response([
            'status' => 1,
            'message' => 'Thành công'
        ]);
    }

    public function storeItem(Request $request)
    {
        if (auth('backend')->user()->cannot('add-item')) {
            abort(403);
        }
        $ownerId = auth('backend')->user()->id;

        if (auth('backend')->user()->type == User::STAFF) {
            $ownerId = auth('backend')->user()->staff_owner_id;
        }

        $data = $request->all();
        $numbers = $data['number'];
        if (empty($numbers)) {
            return response([
                'status' => 0,
                'message' => 'Không được bỏ trống số lượng'
            ]);
        }

        $itemTypeId = $data['item_type_id'];
        $itemType = ItemType::find($itemTypeId);
        if (!$itemType) {
            return response([
                'status' => 0,
                'message' => 'Dữ liệu không hợp lệ'
            ]);
        }

        $warehouseId = $data['warehouse_id'];
        $warehouse = Warehouse::find($warehouseId);
        if (!$warehouse) {
            return response([
                'status' => 0,
                'message' => 'Dữ liệu không hợp lệ'
            ]);
        }
        $createData = [];

        $code = [];
        if (isset($data['code'])) {
            $code = $data['code'];
        }

        try {
            \DB::beginTransaction();

            $ie = ImportExport::create([
                'item_type_id' => $itemType->id,
                'warehouse_id' => $warehouseId,
                'import' => $numbers,
                'export' => 0,
                'type' => Warehouse::IMPORT,
                'user_id' => auth('backend')->user()->id,
            ]);

            for ($i = 1; $i <= $numbers; $i++) {

                $createData = [
                    'name' => $itemType->name,
                    'code' => 'ITEM-' . uniqid(),
                    'reference' => isset($code[$i - 1]) ? $code[$i - 1] : null,
                    'owner_id' => $ownerId,
                    'item_type_id' => $itemType->id,
                    'price' => $data['price'],
                    'status' => $data['status'],
                ];

                $item = Item::create($createData);

                ImportExportItem::create([
                    'item_type_id' => $itemType->id,
                    'item_id' => $item->id,
                    'import_export_id' => $ie->id,
                ]);


                \DB::table('item_warehouses')->insert([
                    'item_id' => $item->id,
                    'item_type_id' => $itemType->id,
                    'warehouse_id' => $warehouseId,
                    'amount' => 1
                ]);


            }

            $itemType->remain = $itemType->remain + $numbers;
            $itemType->save();

            $warehouse->remain = $warehouse->remain + $numbers;
            $warehouse->save();


            \DB::commit();
        } catch (\Exception $exception) {
            \DB::rollBack();
            return response([
                'status' => 0,
                'message' => 'Có lỗi xảy ra'
            ]);
        }
        return response([
            'status' => 1,
            'message' => 'Thành công'
        ]);
    }

    public function editItem(Request $request)
    {
        $data = $request->all();

        $item = Item::find($data['id']);
        if ($item) {
            $item->update($data);
        }
        return response([
            'status' => 1,
            'message' => 'Thành công'
        ]);
    }

    public function deleteItem(Request $request)
    {
        $data = $request->all();

        $item = Item::find($data['id']);
        if ($item) {
            $item->delete();
        }
        return response([
            'status' => 1,
            'message' => 'Thành công'
        ]);
    }

    public function getWarehouseByAttribute(Request $request)
    {
        $ownerId = auth('backend')->user()->id;
        if(auth('backend')->user()->type == User::STAFF)
        {
            $ownerId = auth('backend')->user()->staff_owner_id;
        }
        $items = Warehouse::where('owner_id', $ownerId);
        return Datatables::of($items)
            ->addIndexColumn()
            ->editColumn('name', function ($item) {
                return '<span class="name_text">' . $item->name . '</span>'
                    . '<input type="text" class="form-control name_input" value="' . $item->name . '" style="display: none">';
            })
            ->editColumn('remain', function ($item) {
                return '<a class="detail-remain" href="#detail-remain" data-toggle="modal" data-id="' . $item->id . '">' . $item->remain . '</a>';
            })
            ->addColumn('action', function ($item) {
                $edit = '<a href="#" data-id="' . $item->id . '"class="btn btn-sm btn-outline btn-editable purple btn_edit_ware_house" style="float: left"><i class="fa fa-edit"></i> Sửa</a>';
                $delete = '<a data-id="' . $item->id . '" class="btn btn-sm btn-outline btn-editable dark black btn_delete_ware_house"><i class="fa fa-trash" style="float: left"></i> Xóa</a>';

                if (auth('backend')->user()->cannot('edit-warehouse')) {
                    $edit = null;
                }

                if (auth('backend')->user()->cannot('delete-warehouse')) {
                    $delete = null;
                }
                return $edit .

                    '<a href="#" data-id="' . $item->id . '"class="btn btn-sm btn-outline btn-save green btn_save_ware_house" style="display: none; float: left"><i class="fa fa-edit"></i> Lưu</a>' .
                    '<a href="#" data-id="' . $item->id . '"class="btn btn-sm btn-outline btn-cancel red btn_cancel_ware_house" style="display: none; float: left"><i class="fa fa-edit"></i> Hủy</a>' .
                    $delete;

            })
            ->make(true);
    }

    public function editWareHouse(Request $request)
    {
        $data = $request->all();

        $item = Warehouse::find($data['id']);
        if ($item) {
            $item->update($data);
        }
        return response([
            'status' => 1,
            'message' => 'Thành công'
        ]);
    }

    public function deleteWareHouse(Request $request)
    {
        $data = $request->all();
        $item = Warehouse::find($data['id']);
        if ($item) {
            $item->delete();
        }
        return response([
            'status' => 1,
            'message' => 'Thành công'
        ]);
    }

    public function create(Request $request)
    {
        return response([
            'status' => 1,
            'data' => view('admin2.warehouse.create')->render()
        ]);
    }

    public function store(Request $request)
    {
        if (auth('backend')->user()->cannot('add-warehouse')) {
            abort(403);
        }
        $ownerId = auth('backend')->user()->id;

        if (auth('backend')->user()->type == User::STAFF) {
            $ownerId = auth('backend')->user()->staff_owner_id;
        }

        $data = $request->all();
        $data['owner_id'] = $ownerId;
        Warehouse::create($data);
        return response([
            'status' => 1,
            'message' => 'Thành công'
        ]);
    }


    public function importExcel(Request $request)
    {
        $file = $request->file('file');
        $fileName = Functions::uploadFileStorage($file);

        $filepath = storage_path('files/' . $fileName);
        $count = 0;
        $status = 0;

        $ownerId = auth('backend')->user()->id;
        if (auth('backend')->user()->type == User::STAFF) {
            $ownerId = auth('backend')->user()->staff_owner_id;
        }

        \DB::beginTransaction();

        try {
            \Excel::load($filepath, function ($reader) use (&$count, $ownerId) {

                $data = $results = $reader->all();
                $count = count($data);
                foreach ($data as $row) {

                    $itemTypeName = trim($row['loai_tai_san']);
                    $warehouseName = trim($row['kho']);
                    $numbers = intval(trim($row['so_luong']));
                    $reference = isset($row['ma_tham_chieu']) ? $row['ma_tham_chieu'] : null;

                    $itemType = ItemType::where('name', $itemTypeName)->where('owner_id', $ownerId)->first();
                    if (!$itemType) {
                        return redirect()->back()->with('error', 'Dữ liệu ' . $itemTypeName . ' không tồn tại trong loại tài sản');
                    }

                    $warehouse = Warehouse::where('name', $warehouseName)->where('owner_id', $ownerId)->first();

                    if (!$warehouse) {
                        return redirect()->back()->with('error', 'Dữ liệu ' . $warehouseName . ' không tồn tại trong danh sách kho');
                    }

                    $warehouseId = $warehouse->id;

                    $ie = ImportExport::create([
                        'item_type_id' => $itemType->id,
                        'warehouse_id' => $warehouseId,
                        'import' => $numbers,
                        'export' => 0,
                        'type' => Warehouse::IMPORT,
                        'user_id' => auth('backend')->user()->id,
                    ]);

                    for ($i = 1; $i <= $numbers; $i++) {

                        $createData = [
                            'name' => $itemType->name,
                            'code' => 'ITEM-' . uniqid(),
                            'reference' => $reference,
                            'owner_id' => $ownerId,
                            'item_type_id' => $itemType->id
                        ];

                        $item = Item::create($createData);

                        ImportExportItem::create([
                            'item_type_id' => $itemType->id,
                            'item_id' => $item->id,
                            'import_export_id' => $ie->id,
                        ]);


                        \DB::table('item_warehouses')->insert([
                            'item_id' => $item->id,
                            'item_type_id' => $itemType->id,
                            'warehouse_id' => $warehouseId,
                            'amount' => 1
                        ]);


                    }

                    $itemType->remain = $itemType->remain + $numbers;
                    $itemType->save();

                    $warehouse->remain = $warehouse->remain + $numbers;
                    $warehouse->save();

                    //  dd($row);

                }


            });


            \DB::commit();

        } catch (\Exception  $exception) {
            \DB::rollBack();

            return redirect()->back()->with('error', 'Có lỗi xảy ra vui lòng thử lại sau');
        }

        return redirect()->back()->with('success', 'Thành công');

    }

    public function deleteItemType(Request $request)
    {
        $id = $request->input('id');

        $item = ItemType::find($id);

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

        $cnt = Item::where('item_type_id', $id)->count();

        if ($cnt > 0) {

            return response([
                'status' => 0,
                'message' => 'Bạn phải xóa hết tài sản liên quan'
            ]);
        }

        $item->delete();

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


}
