<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;

use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
use DataTables;


use App\Staging;
use App\RoleModule;
use App\BOM;

// DataTables PHP library

use DataTables\Editor,
    DataTables\Editor\Field,
    DataTables\Editor\Format,
    DataTables\Editor\Mjoin,
    DataTables\Editor\Options,
    DataTables\Editor\Upload,
    DataTables\Editor\Validate,
    DataTables\Editor\ValidateOptions;

class StagingController extends Controller
{
    // public function index()
    // {
    //     return view("Staging.index");
    // }
    public function index(Request $request)
    {
        $pisaItem = new BOM();
        $table = $pisaItem->getTable();
        $tableColumns = $this->getTableColumns($table);

        return view('Staging.index', compact('tableColumns'));
    }

    public function show(Request $request)
    {
        $work_order = isset($request['workorder']) ? $request['workorder'] : "";

        $Staging = BOM::select(
            'bomid',
            'workordernum',
            'mfgpartnum',
            'ncapartnum',
            'description',
            'datecode',
            'lotcode',
            'refdes',
            'kit',
            'active',
            'rack',
            'slot',
            'side');

        if ($work_order != "") {
            $Staging = $Staging->where("workordernum", $work_order);
        }

        $Staging = $Staging->latest("bomid")->get();
        return Datatables::of($Staging)
            ->addColumn('action', function ($Staging) {
                $edit_var = "";
                $destory = "";
                $copy_var = "";

                if (Auth::user()->can('edit-staging')) {
                    $copy_var =
                        '<a href="#" class="copy_staging" data-id="' .
                        $Staging->bomid .
                        '" title="Copy"><i class="ik ik-copy f-16 mr-15 text-blue"></i></a>';

                    $edit_var =
                        '<a href="#" class="update_staging" data-id="' .
                        $Staging->bomid .
                        '" title="Edit"><i class="ik ik-edit-2 f-16 mr-15 text-green"></i></a>';
                }

                if (Auth::user()->can('delete-staging')) {
                    $destory =
                        '<a href="#" class="delete_staging" data-id="' .
                        $Staging->bomid .
                        '" title="Delete"><i class="ik ik-trash-2 f-16 text-red"></i></a>';
                }

                return '<div class="table-actions">
                        		' .
                    $copy_var .
                    '
                                ' .
                    $edit_var .
                    '
                                ' .
                    $destory .
                    '    
                            </div>';
            })
            ->rawColumns(['action'])
            ->make(true);
    }

    public function preview($id)
    {
        $get_engi_details = BOM::where("bomid", $id)
            ->get()
            ->first();
        return $get_engi_details;
    }

    public function copy($id)
    {
        $get_engi_details = BOM::where("bomid", $id)
            ->get()
            ->first();
        return $get_engi_details;
    }

    public function store(Request $request)
    {
        $bomid = $request['bomid'];
        $workorder = $request['update_workorder'];
        $mfgpartnum = $request['update_mfgpartnum'];
        $ncapartnum = $request['update_ncapartnum'];
        $description = $request['update_description'];
        $datecode = $request['update_datecode'];
        $lotcode = $request['update_lotcode'];
        $refdes = $request['update_refdes'];
        $kit = $request['update_kit'];
        $active = $request['update_active'];
        $rack = $request['update_rack'];
        $slot = $request['update_slot'];
        $side = $request['update_side'];

        $staging_update = BOM::where("bomid", $bomid)->update([
            "workordernum" => $workorder,
            "mfgpartnum" => $mfgpartnum,
            "ncapartnum" => $ncapartnum,
            "description" => $description,
            "datecode" => $datecode,
            "lotcode" => $lotcode,
            "refdes" => $refdes,
            "kit" => $kit,
            "active" => $active,
            "rack" => $rack,
            "slot" => $slot,
            "side" => $side,
        ]);

        if ($staging_update) {
            return response()->json(['status' => 'success']);
            // return redirect('engineering')->with('success', 'row updated succesfully!');
        } else {
            return response()->json(['status' => 'error']);
            // return redirect('engineering')->with('error', 'Failed to update the row!');
        }
    }

    public function copycreate(Request $request)
    {
        $workorder = $request['copy_workorder'];
        $mfgpartnum = $request['copy_mfgpartnum'];
        $ncapartnum = $request['copy_ncapartnum'];
        $description = $request['copy_description'];
        $datecode = $request['copy_datecode'];
        $lotcode = $request['copy_lotcode'];
        $refdes = $request['copy_refdes'];
        $kit = $request['copy_kit'];
        $active = $request['copy_active'];
        $rack = $request['copy_rack'];
        $slot = $request['copy_slot'];
        $side = $request['copy_side'];

        $staging_create = BOM::create([
            "workordernum" => $workorder,
            "mfgpartnum" => $mfgpartnum,
            "ncapartnum" => $ncapartnum,
            "description" => $description,
            "datecode" => $datecode,
            "lotcode" => $lotcode,
            "refdes" => $refdes,
            "kit" => $kit,
            "active" => $active,
            "rack" => $rack,
            "slot" => $slot,
            "side" => $side,
        ]);

        if ($staging_create) {
            return response()->json(['status' => 'success']);
            // return redirect('engineering')->with('success', 'New Copy row created succesfully!');
        } else {
            return response()->json(['status' => 'error']);
            // return redirect('engineering')->with('error', 'Failed to create new copy row!');
        }
    }

    public function create(Request $request)
    {
        $workorder = $request['workorder'];
        $mfgpartnum = $request['mfgpartnum'];
        $ncapartnum = $request['ncapartnum'];
        $description = $request['description'];
        $datecode = $request['datecode'];
        $lotcode = $request['lotcode'];
        $refdes = $request['refdes'];
        $kit = $request['kit'];
        $active = $request['active'];
        $rack = $request['rack'];
        $slot = $request['slot'];
        $side = $request['side'];

        $staging_create = BOM::create([
            "workordernum" => $workorder,
            "mfgpartnum" => $mfgpartnum,
            "ncapartnum" => $ncapartnum,
            "description" => $description,
            "datecode" => $datecode,
            "lotcode" => $lotcode,
            "refdes" => $refdes,
            "kit" => $kit,
            "active" => $active,
            "rack" => $rack,
            "slot" => $slot,
            "side" => $side,
        ]);

        if ($staging_create) {
            return response()->json(['status' => 'success']);
            // return redirect('engineering')->with('success', 'New row created succesfully!');
        } else {
            return response()->json(['status' => 'error']);
            // return redirect('engineering')->with('error', 'Failed to create new row!');
        }
    }

    public function update(Request $request)
    {
        $bomid = $request['bomid'];
        $datecode = $request['datecode'];
        $active = $request['active'];
        $rack = $request['rack'];
        $slot = $request['slot'];
        $side = $request['side'];
        $get_id = BOM::where("bomid", $bomid)
            ->pluck("bomid")
            ->first();
        if (!empty($get_id) || isset($get_id)) {
            $update = BOM::where("bomid", $bomid)->update([
                "datecode" => $datecode,
                "active" => $active,
                "rack" => $rack,
                "slot" => $slot,
                "side" => $side,
            ]);
            $updated_list = BOM::where("bomid", $bomid)->first();
            return Response::json($updated_list);
        } else {
            return redirect()
                ->back()
                ->with(
                    'message',
                    'Request param is null! Can\'t update the row'
                );
        }
    }

    public function delete($id)
    {
        $row = BOM::where("bomid", $id)->get();
        if ($row) {
            BOM::where("bomid", $id)->delete();
            return response()->json(['status' => 'success']);
            // return redirect('engineering')->with('success', 'row removed succesfully!');
        } else {
            return response()->json(['status' => 'error']);
            // return redirect('engineering')->with('error', 'row not found or failed to remove!');
        }
    }

    public function getTableColumns($table)
    {
        return Schema::getColumnListing($table);
    }

    public function machineaudit()
    {
        $pisaItem = new BOM();
        $table = $pisaItem->getTable();
        $tableColumns = $this->getTableColumns($table);

        return view('Staging.machineaudit', compact('tableColumns'));
    }

    public function getImportCsv(Request $request)
    {
        $request
            ->session()
            ->flash('workordernum', $request->input('workordernum'));
        $request
            ->session()
            ->flash('audit_smtoperator', $request->input('audit_smtoperator'));
        $request
            ->session()
            ->flash('audit_qcoperator', $request->input('audit_qcoperator'));

        if (!$request->input('workordernum')) {
            return redirect()
                ->back()
                ->with('error', 'Please enter work order.');
        }

        if (!$request->hasFile('csv_file')) {
            return redirect()
                ->back()
                ->with('error', 'Please choose csv file.');
        }

        $filename = $_FILES['csv_file']['name'];
        $file_data = fopen($_FILES['csv_file']['tmp_name'], 'r');
        $ext = pathinfo($filename, PATHINFO_EXTENSION);
        if ($ext !== "csv") {
            return redirect()
                ->back()
                ->with('error', 'File format must be csv file.');
        }

        if ($request->has('header')) {
            $column = fgetcsv($file_data);
            Log::error($column);
            $column = fgetcsv($file_data);
            Log::error($column);
            $num = count($column);
            Log::error($num . " fields in header");
            for ($c = 0; $c < $num; $c++) {
                // Log::error($column[$c]);
            }
            // if($num !== 8)
            // return redirect()->back()->with('error', 'Format of the CSV file isn’t correct. Must be 8 columns!');
        }

        $i = 0;
        while ($row = fgetcsv($file_data)) {
            if (empty($row[4])) {
                break;
            }

            $num = count($row);

            for ($c = 0; $c < $num; $c++) {
                if (isset($row[$c]) && !empty($row[$c])) {
                    // $row_data[$i][$c] = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', utf8_encode($row[$c]));
                    $row_data[$i][$c] = mb_convert_encoding(
                        $row[$c],
                        "UTF-8",
                        "windows-1251"
                    );
                    // $row_data[$i][$c] = iconv("utf-8", "ascii//TRANSLIT//IGNORE", $row[$c]);
                    // $row_data[$i][$c] = $row[$c];
                } else {
                    $row_data[$i][$c] = null;
                }
            }
            $i++;
        }

        Log::error($i);

        $pisaItem = new BOM();
        $table = $pisaItem->getTable();
        $tableColumns = $this->getTableColumns($table);

        $feederData = $row_data;

        $bomData = BOM::where("workordernum", $request->workordernum)->get(); //orderBy('updated_at', 'desc');

        return view(
            'Staging.machineaudit',
            compact('tableColumns', 'feederData', 'bomData')
        );
    }

    public function audit_validate(Request $request)
    {
        if (!$request->audit_smtoperator || !$request->audit_qcoperator) {
            return response()->json([
                'status' => "error",
                'message' => "SMT/QC Operator Missing",
            ]);
        }

        $pisaitem = BOM::where('workordernum', $request->workordernum)
            ->where('mfgpartnum', $request->mfgpartnum)
            ->first();

        if (!$pisaitem) {
            return response()->json([
                'status' => "error",
                'message' => "mfgpartnum not found: " . $request->mfgpartnum,
            ]);
        }

        BOM::where("bomid", $pisaitem->bomid)->update([
            "audit_linenum" => $request->audit_linenum,
            "audit_machinenum" => $request->audit_machinenum,
            "audit_smtoperator" => $request->audit_smtoperator,
            "audit_qcoperator" => $request->audit_qcoperator,
            "audit_userid" => $request->audit_userid,
            "audit_valid" => 1,
        ]);

        return response()->json([
            'status' => "success",
            'message' => 'Validated: ' . $pisaitem->mfgpartnum,
        ]);
    }


    public function editDataTable(Request $request)
    {
        include app_path() . '/Http/lib/DataTables.php';
        Editor::inst($db, 'bom')
            ->field(
                Field::inst('bom.mfgpartnum'),
                Field::inst('bom.ncapartnum'),
                Field::inst('bom.description'),
                Field::inst('bom.datecode'),
                Field::inst('bom.lotcode'),
                Field::inst('bom.refdes'),
                Field::inst('bom.kit'),
                Field::inst('bom.active'),
                Field::inst('bom.rack'),
                Field::inst('bom.slot'),
                Field::inst('bom.side'),                
            )
            // ->where('bom.side',$db)
            ->where('workordernum', $request->workorder )            
            ->process($_POST)
            ->json();
    }
}
