<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;
use App\Models\User;
use App\Models\Branch;
use App\Models\Uploadfile;
use App\Exports\ExportUploadFiles;
use App\Imports\ImportUploadFiles;
use Maatwebsite\Excel\Facades\Excel;
use Auth, DB, Mail, Validator, File, DataTables, Exception;

class UploadfileMasterController extends Controller{
    /** construct */
        public function __construct(){
            $this->middleware('permission:upload_file_master-create', ['only' => ['create']]);
            $this->middleware('permission:upload_file_master-edit', ['only' => ['edit']]);
            $this->middleware('permission:upload_file_master-view', ['only' => ['view']]);
            $this->middleware('permission:upload_file_master-delete', ['only' => ['delete']]);
        }
    /** construct */

    /** index */
        public function index(Request $request){
            if($request->ajax()){
                $data = Uploadfile::select('upload_file_master.*','branches.name as branch_name')->join('branches','branches.id','=','upload_file_master.fk_branch_id')->orderBy('upload_file_master.id','desc')->where('upload_file_master.status','!=','deleted');
                //dd($data);
                return Datatables::of($data)
                    ->addIndexColumn()
                    ->addColumn('action', function($data){
                        $return = '<div class="btn-group">';

                        if(auth()->user()->can('upload_file_master-view')){
                            $return .= '<a href="'.route('upload_file_master.view', ['id' => base64_encode($data->id)]).'" class="btn btn-default btn-xs">
                                            <i class="fa fa-eye"></i>
                                        </a> &nbsp;';
                        }   
                        
                        if(auth()->user()->can('upload_file_master-edit')){
                            $return .= '<a href="'.route('upload_file_master.edit', ['id' => base64_encode($data->id)]).'" class="btn btn-default btn-xs">
                                            <i class="fa fa-pencil"></i>
                                        </a> &nbsp;';
                        }   

                        if (auth()->user()->can('upload_file_master-delete')) {
                            $return .= '<a href="javascript:;" class="btn btn-default btn-xs dropdown-toggle" data-toggle="dropdown">
                                                <i class="fa fa-bars"></i>
                                            </a> &nbsp;
                                            <ul class="dropdown-menu">
                                                <li><a class="dropdown-item" href="javascript:;" onclick="change_status(this);" data-status="active" data-id="' . base64_encode($data->id) . '">Active</a></li>
                                                <li><a class="dropdown-item" href="javascript:;" onclick="change_status(this);" data-status="inactive" data-id="' . base64_encode($data->id) . '">Inactive</a></li>
                                                <li><a class="dropdown-item" href="javascript:;" onclick="change_status(this);" data-status="deleted" data-id="' . base64_encode($data->id) . '">Delete</a></li>
                                            </ul>';
                        }

                        $return .= '</div>';

                        return $return;
                    })

                 
                    ->editColumn('status', function ($data) {
                        if ($data->status == 'active') {
                            return '<span class="badge badge-pill badge-success">Active</span>';
                        } else if ($data->status == 'inactive') {
                            return '<span class="badge badge-pill badge-warning">Inactive</span>';
                        } else if ($data->status == 'deleted') {
                            return '<span class="badge badge-pill badge-danger">Deleted</span>';
                        }else{
                            return '-';
                        }
                    })

                    ->rawColumns([ 'action' ,'status'])
                    ->filter(function ($query) {
                                if (request()->get('file_name', false)) {
                                    $query->where('upload_file_master.file_name', 'like', "%" . request()->get("file_name") . "%");
                                }
                                 if (request()->get('purpose', false)) {
                                    $query->where('upload_file_master.purpose', 'like', "%" . request()->get("purpose") . "%");
                                }
                            })
                    ->make(true);
            }
            return view('upload_files.index');
        }
    /** index */

    /** create */
        public function create(Request $request){
            $branch = Branch::where('status','!=','deleted')->get();
            return view('upload_files.create',compact('branch'));
        }
    /** create */

    /** insert */
        public function insert(Request $request){
            if($request->ajax()){
                return true ;
            }
            
            if($request->hasFile('file_name')){
            $file = $request->file_name;            
            $file_name = $file->getClientOriginalName();
            //dd($file_name);
            $folder = public_path('\uploads\documents'.'/' . $request->fk_branch_id);
            if (!File::exists($folder)) {
                File::makeDirectory($folder, 0775, true, true);
            }
            $file = $file->move($folder, $file_name);            
            //dd($file);
            }
            //dd($file_name);
            $crud = [
                'fk_branch_id' => $request->fk_branch_id,
                'file_name' => $file_name,
                'purpose' => $request->purpose,
                'status' => 'active',
                'created_at' => date('Y-m-d H:i:s'),
                'created_by' => auth()->user()->id,
                'updated_at' => date('Y-m-d H:i:s'),
                'updated_by' => auth()->user()->id
            ];
            //dd($crud);
           
            DB::beginTransaction();
            try {
                $a = DB::enableQueryLog();
                //dd($a);
                $last_id = Uploadfile::insertGetId($crud);
                //dd($last_id);
                if ($last_id) {
                    
                    DB::commit();
                    return redirect()->route('upload_file_master')->with('success', 'Record inserted successfully');
                } else {
                    DB::rollback();
                    return redirect()->back()->with('error', 'Failed to insert record')->withInput();
                }
            } catch (\Throwable $th) {
                DB::rollback();
                return redirect()->back()->with('error', 'Something went wrong, please try again later')->withInput();
            }
        }
    /** insert */

    /** view */
        public function view(Request $request){
            $id = base64_decode($request->id);
            $data = Uploadfile::select('upload_file_master.*','branches.name as branch_name')->join('branches','branches.id','=','upload_file_master.fk_branch_id')->where(['upload_file_master.id' => $id])->first();
            return view('upload_files.view')->with(['data' => $data]);
        }
    /** view */

    /** edit */
        public function edit(Request $request){
            $id = base64_decode($request->id);
            $branch = Branch::where('status','!=','deleted')->get();
            $data = Uploadfile::select('upload_file_master.*','branches.name as branch_name')->join('branches','branches.id','=','upload_file_master.fk_branch_id')->where(['upload_file_master.id' => $id])->first();
            return view('upload_files.edit')->with(['data' => $data,'branch'=>$branch]);
        }
    /** edit */     

    /** update */
        public function update(Request $request){
            if($request->ajax()){
                return true ;
            }

            if($request->hasFile('file_name')){
            $file = $request->file_name;            
            $file_name = $file->getClientOriginalName();
            //dd($file_name);
            $folder = public_path('\uploads\documents'.'/' . $request->fk_branch_id);
            if (!File::exists($folder)) {
                File::makeDirectory($folder, 0775, true, true);
            }
            $file = $file->move($folder, $file_name);            
            //dd($file);
            }

            $crud = [
                'fk_branch_id' => $request->fk_branch_id,
                'file_name' => $file_name,
                'purpose' => $request->purpose,
                'status' => 'active',
                'updated_at' => date('Y-m-d H:i:s'),
                'updated_by' => auth()->user()->id
            ];

            DB::beginTransaction();
            try {
                DB::enableQueryLog();
                $update = Uploadfile::where(['id' => $request->id])->update($crud);
                if ($update) {
                    
                    DB::commit();
                    return redirect()->route('upload_file_master')->with('success', 'Record updated successfully');
                } else {
                    DB::rollback();
                    return redirect()->back()->with('error', 'Failed to update record')->withInput();
                }
            } catch (\Throwable $th) {
                DB::rollback();
                return redirect()->back()->with('error', 'Something went wrong, please try again later')->withInput();
            }
        }
    /** update */

    /** change-status */
        public function change_status(Request $request){
            if (!$request->ajax()) { exit('No direct script access allowed'); }
            
            $id = base64_decode($request->id);
            $data = Uploadfile::where(['id' => $id])->first();

            if(!empty($data)){
                $update = Uploadfile::where(['id' => $id])->update(['status' => $request->status, 'updated_at' => date('Y-m-d H:i:s'), 'updated_by' => auth()->user()->id]);
                if($update){
                    return response()->json(['code' => 200]);
                }else{
                    return response()->json(['code' => 201]);
                }
            }else{
                return response()->json(['code' => 201]);
            }
          
        }
    /** change-status */
    
    public function export(Request $request){
        if(isset($request->slug) && $request->slug != null){
            $slug = $request->slug;
        }else{
            $slug = 'all';
        }

        $name = 'UploadFiles_'.Date('YmdHis').'.xlsx';

        try {
            return Excel::download(new ExportUploadFiles($slug), $name);
        }catch(\Exception $e){
            return redirect()->back()->with('error' ,$e->getMessage());
        }
    }
    
    /** Import */
    public function import(Request $request){
           
        if(Excel::import(new ImportUploadFiles, $request->file('file')->store('file'))){
            return redirect()->route('upload_file_master')->with('sucess' ,'File Imported Sucessfully');
        }else{
            return redirect()->route('upload_file_master')->with('error' ,'Faild To Import File!');
        }
    }
    /** Import */
    
}
