<?php namespace App\Http\Controllers;

use App\Models\FraudRule;
use App\Traits\NotDeletableTrait;
use Illuminate\Http\Request;
use Yajny\Member\FraudDetection\FraudDetection;
use Yajny\Member\Models\FraudRule as FraudRuleModel;


class FraudRulesController extends GenericController
{
    use NotDeletableTrait;

    protected $layout = "layouts.main";
    protected $data = array();
    public $module = 'fraudrules';
    static $per_page = '10';

    public function __construct()
    {
        $this->model = new FraudRule();
        parent::__construct();
    }

    public function index(Request $request)
    {
        $this->grab($request);
        if ($this->access['is_view'] == 0 && $this->access['is_search'] == 0)
            return redirect('dashboard')->with('message', __('core.note_restric'))->with('status', 'error');
        elseif ($this->access['is_view'] == 0 && $this->access['is_search'] == 1)
            $fraudRules = [];
        else
            $fraudRules = FraudRule::with('fraud_logs')->get();

        return view('manage.fraudrules.index', array_merge($this->data, ['fraudRules' => $fraudRules]));
    }

    public function create(Request $request, $id = 0)
    {
        if ($this->access['is_edit'] == 0)
            return redirect('dashboard')->with('message', __('core.note_restric'))->with('status', 'error');
        return view('manage.fraudrules.form', ['row' => (new FraudRule())->toArray()]);
    }

    public function store(Request $request)
    {
        if ($this->access['is_edit'] == 0)
            return redirect('dashboard')->with('message', __('core.note_restric'))->with('status', 'error');
        $fraudRule = $this->validateRequestAndGetFraudRule($request);
        $fraudRule->save();
        //dd($fraudRule);
        return redirect()->to('/manage/fraudrules');
    }

    public function edit(Request $request, $fraudRuleID)
    {
        if ($this->access['is_edit'] == 0)
            return redirect('dashboard')->with('message', __('core.note_restric'))->with('status', 'error');
        $fraudRule = FraudRule::findOrFail($fraudRuleID);
        $row = $fraudRule->toArray();
        return view('manage.fraudrules.form', ['row' => $row]);
    }

    public function simulate(Request $request)
    {
        if ($this->access['is_edit'] == 0)
            return redirect('dashboard')->with('message', __('core.note_restric'))->with('status', 'error');
        $fraudRule = $this->validateRequestAndGetFraudRule($request);
        return view('manage.fraudrules.form', [
            'row' => $fraudRule->toArray(),
            'user_ids' => (new FraudDetection($fraudRule))->simulate()
        ]);

    }

    private function validateRequestAndGetFraudRule(Request $request)
    {
        $validationRules = [
            'name' => "required",
            'status' => 'required'
        ];
        if (isset($request->id) && !empty($request->id)) {
            $fraudRule = FraudRuleModel::find($request->id);
        } else {
            $fraudRule = new FraudRuleModel();
            $validationRules['store_ids'] = 'required';
            $validationRules['action'] = 'required';
            $validationRules['effective_from'] = 'required';
            $fraudRule->action = $request->action;
            $fraudRule->store_ids = $request->store_ids;
            $fraudRule->order_count = $request->order_count ?: null;
            $fraudRule->order_count_per = $request->order_count_per ?: null;
            $fraudRule->total_order_amount = $request->total_order_amount ?: null;
            $fraudRule->total_order_amount_per = $request->total_order_amount_per ?: null;
            $fraudRule->effective_from = $request->effective_from;
        }
        $request->validate($validationRules);
        $fraudRule->name = $request->name;
        $fraudRule->status = $request->status;
        $fraudRule->effective_to = $request->effective_to ?: null;
        return $fraudRule;
    }
}
