<?php
/**
 * Created by PhpStorm.
 * User: sunil
 * Date: 16/11/18
 * Time: 11:56 AM
 */

namespace App\Http\Controllers\Grade;

use App\CustomGrades;
use App\CustomGradesMain;
use App\Grades;
use App\Http\Controllers\Controller;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Session;

class CustomGradeController extends Controller
{
    private $request;
    private $includeTable = [
        'consumer_application', 'consumer_application_element', 'corona_hotspot', 'credit_report', 'equifax_accounts', 'equifax_report', 'finbit_datas', 'foir', 'merchant', 'employment_verification'
    ];

    public function __construct(Request $request){
        $this->request = $request;
    }

    public function index(){

        $grades = CustomGradesMain::get();
        return view('admin.grade.custom_grade_index', ['grades' => $grades]);
    }

    public function edit($id)
    {
        $tables = DB::connection()->getDoctrineSchemaManager()->listTableNames();
        $tablesData = [];
        $tablesNames = [];
        foreach ($tables as $table){
            if(in_array($table, $this->includeTable)) {
                $tablesData = array_merge($tablesData, $this->getTableColumns($table));
                $tablesNames[] = $table;
            }
        }

        if ($this->request->has('grade') && $this->request->has('clone')) {
            $grade = CustomGradesMain::with('grade')->find($this->request->get('grade'));
            return view('admin.grade.custom_grade_edit', ['grade' => $grade, 'tablesData' => $tablesData, 'tablesNames' => $tablesNames]);
        }else{
            $grade = CustomGradesMain::with('grade')->find($id);
        }
        return view('admin.grade.custom_grade_edit',['grade' => $grade, 'tablesData' => $tablesData, 'tablesNames' => $tablesNames]);
    }

    public function add(){


        $tables = DB::connection()->getDoctrineSchemaManager()->listTableNames();
        $tablesData = [];
        $tablesNames = [];
        foreach ($tables as $table){
            if(in_array($table, $this->includeTable)) {
                $tablesData = array_merge($tablesData, $this->getTableColumns($table));
                $tablesNames[] = $table;
            }
        }

        if ($this->request->has('grade') && $this->request->has('clone')) {
            $grade = CustomGrades::find($this->request->get('grade'));
            return view('admin.grade.custom_grade_edit', ['grade' => $grade, 'tablesData' => $tablesData, 'tablesNames' => $tablesNames]);
        }
        return view('admin.grade.custom_grade_edit',['tablesData' => $tablesData, 'tablesNames' => $tablesNames]);
    }

    private function getTableColumns($table) {
        $columns = DB::connection()->getSchemaBuilder()->getColumnListing($table);
        $names = [];
        foreach ($columns as $column){
            if(!in_array($column, ['id','created_at','updated_at','user_id','offer_id','_id','id_type','deleted_at']))
            $names[$table][] = $table.'.'.$column;
        }

        return $names;
    }

    public function save(){
        $status = 'success';
        $message = 'Rule Added Successfully';
        try {
            $_grade = CustomGradesMain::where('rule', trim($this->request->get('rule')))->first(['id']);
            if (isset($_grade->id)) {
                Session::flash('error', 'Duplicate Rule Name');
                return redirect()->back();
            }


            if(count($this->request->get('condition')) != count($this->request->get('operator'))){
                Session::flash('error', 'Improper Conditions');
                return redirect()->back();
            }

            if(count($this->request->get('condition')) != count($this->request->get('value'))){
                Session::flash('error', 'Improper Conditions');
                return redirect()->back();
            }


            $data = [];
            $date = Carbon::now()->toDateTimeString();
            $user_id = Auth::user()->id;

            $customGradesMain = CustomGradesMain::insertGetId([
                'rule' => $this->request->get('rule'),
                'description' => $this->request->get('description'),
                'tables' => implode(',',$this->request->get('tables')),
                'user_id' => $user_id,
                'created_at' => $date,
            ]);

            foreach ($this->request->get('condition') as $key => $condition){
                $operator = $this->request->get('operator');
                $value = $this->request->get('value');

                $data[] = [
                    'grade_id' => $customGradesMain,
                    'condition' => $condition,
                    'operator' => $operator[$key],
                    'value' => $value[$key],
                    'user_id' => $user_id,
                    'created_at' => $date
                ];
            }

            CustomGrades::insert($data);

        } catch (\Exception $e) {
            $status = 'error';
            $message = 'Exception occurred while saving custom grade';
        }
        Session::flash($status, $message);
        return redirect()->to('/admin/grades/v1');
    }

    public function update($id){
        try{

            $status = 'success';
            $message = 'Rule Updated Successfully';

            $_grade = CustomGradesMain::where('id','!=',$id)->where('rule', trim($this->request->get('rule')))->first(['id']);
            if (isset($_grade->id)) {
                Session::flash('error', 'Duplicate Rule Name');
                return redirect()->back();
            }

            if(count($this->request->get('condition')) != count($this->request->get('operator'))){
                Session::flash('error', 'Improper Conditions');
                return redirect()->back();
            }

            if(count($this->request->get('condition')) != count($this->request->get('value'))){
                Session::flash('error', 'Improper Conditions');
                return redirect()->back();
            }

            $date = Carbon::now()->toDateTimeString();
            $user_id = Auth::user()->id;
            $data = [];

            CustomGradesMain::where('id', $id)->update([
                'rule' => $this->request->get('rule'),
                'description' => $this->request->get('description'),
                'tables' => implode(',',$this->request->get('tables')),
                'user_id' => $user_id,
                'updated_at' => $date,
            ]);

            foreach ($this->request->get('condition') as $key => $condition){
                $operator = $this->request->get('operator');
                $value = $this->request->get('value');

                $data[] = [
                    'grade_id' => $id,
                    'condition' => $condition,
                    'operator' => $operator[$key],
                    'value' => $value[$key],
                    'user_id' => $user_id,
                    'created_at' => $date
                ];
            }
            CustomGrades::where('grade_id', $id)->delete();
            CustomGrades::insert($data);


        }catch (\Exception $e){
            $status = 'error';
            $message = 'Exception occurred while updating custom grade';
        }

        Session::flash($status, $message);
        return redirect()->to('/admin/grade/edit/'.$id.'/v1');
    }
}
