<?php
namespace App\Controllers\Admin;
use App\Core\Service\Logger;
use App\Controllers\BaseController;
use App\Model\AdminClientModel;
use App\Model\AdminModel;
use App\Library\Utilities;
class ClientController extends BaseController
{
    private $AdminClientModel;
    private $AdminModel;
    public $Utilities;
    public function __construct() {
        parent::__construct();
        $this->AdminModel = new AdminModel();
        $this->AdminClientModel = new AdminClientModel();
    }

    public function getClientPlanDetail() {
        try {
            $rules = [
                'plan_id' => array("rules" => 'required|integer', 'label' => "Plan ID"),
                'plan_type' => array("rules" => 'required', 'label' => "Plan Type"),
            ];
            $validation = $this->validateReqData($rules, $this->input);
            if(empty($validation['status'])) {
                throw new \Exception($validation['error']);
            }
            if(!$validation['valid']) {
                $this->sendResponse(array('code' => 400, 'message' => 'Validation Error', 'data'=>$validation['validation_error']));
            }
            $client_id = !empty($this->input['client_id']) ? $this->input['client_id'] : 0;
            $resp = $this->AdminClientModel->getClientPlanDetail($this->input['plan_id'], $client_id, $this->input['plan_type']);
            if(!$resp['status']) {
                throw new \Exception($resp['error']);
            }
            $this->sendResponse(array('code' => 200, 'message' => null, 'data'=> $resp['data']));
        } catch(\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line'=>$e->getLine()]);
            $this->sendResponse(array('code' => 400, 'message' => $e->getMessage(), 'data'=> null));
        }
    }

    public function getLastPlanLog() {
        try {
            $rules = [
                'client_id' => array("rules" => 'required|integer', 'label' => "Client ID")
            ];
            $validation = $this->validateReqData($rules, $this->input);
            if(empty($validation['status'])) {
                throw new \Exception($validation['error']);
            }
            if(!$validation['valid']) {
                $this->sendResponse(array('code' => 400, 'message' => 'Validation Error', 'data'=>$validation['validation_error']));
            }
            $resp = $this->AdminClientModel->getClientLastPlanLog($this->input['client_id']);
            if(!$resp['status']) {
                throw new \Exception($resp['error']);
            }
            $this->sendResponse(array('code' => 200, 'message' => null, 'data'=> $resp['data']));
        } catch(\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line'=>$e->getLine()]);
            $this->sendResponse(array('code' => 400, 'message' => $e->getMessage(), 'data'=> null));
        }
    }

    public function editPlanLog() {
        try {
            $rules = [
                'client_id' => array("rules" => 'required|integer', 'label' => "Client ID"),
                'plan_id' => array("rules" => 'required|integer', 'label' => "Plan ID"),
                'plan_validity' => array("rules" => 'required', 'label' => "Plan Validity"),
            ];
            $validation = $this->validateReqData($rules, $this->input);
            if(empty($validation['status'])) {
                throw new \Exception($validation['error']);
            }
            if(!$validation['valid']) {
                $this->sendResponse(array('code' => 400, 'message' => 'Validation Error', 'data'=>$validation['validation_error']));
            }
            $last_log = $this->AdminClientModel->getClientLastPlanLog($this->input['client_id']);
            if(!$last_log['status']) {
                throw new \Exception($last_log['error']);
            }
            $new_log = $this->AdminClientModel->preparePlanLogData($this->input, $last_log['data'], $last_log['data']['action']);
            if(!$new_log['status']) {
                throw new \Exception($new_log['error']);
            }
            $new_log['data']['parent_id'] = $last_log['data']['parent_id'];
            $new_log['data']['client_id'] = $this->input['client_id'];
            $log = $this->AdminClientModel->editPlanLog($last_log['data'], $new_log['data']);
            if(!$log['status']) {
                throw new \Exception($log['error']);
            } else {
                $this->sendResponse(array('code' => 200, 'message' => 'Plan log updated successfully', 'data'=> null));
            }
        } catch(\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line'=>$e->getLine()]);
            $this->sendResponse(array('code' => 400, 'message' => $e->getMessage(), 'data'=> null));
        }
    }

    public function renewUpdatePlan() {
        try {
            $rules = [
                'client_id' => array("rules" => 'required|integer', 'label' => "Client ID"),
                'plan_id' => array("rules" => 'required|integer', 'label' => "Plan ID"),
                'plan_validity' => array("rules" => 'required', 'label' => "Plan Validity"),
                'action' => array("rules" => 'required', 'label' => "Action (RENEW or UPDATE)"),
                'amount' => array("rules" => 'integer', 'label' => "Amount"),
                'payment_date' => array("rules" => 'valid_date[Y-m-d]', 'label' => "Payment Date"),
                'transaction_no' => array("rules" => 'max_length[100]', 'label' => "Transaction No."),
                'transaction_no' => array("rules" => 'max_length[100]', 'label' => "Remark"),
            ];
            $validation = $this->validateReqData($rules, $this->input);
            if(empty($validation['status'])) {
                throw new \Exception($validation['error']);
            }
            if(!$validation['valid']) {
                $this->sendResponse(array('code' => 400, 'message' => 'Validation Error', 'data'=>$validation['validation_error']));
            }
            $cl = $this->AdminModel->getMasterData($this->AdminModel->tables["admin_client_master"], "id=:id", [":id"=>$this->input['client_id']]);
            if(!$cl['status']) {
                throw new \Exception($cl['error']);
            }
            if(empty($cl['data'])) {
                throw new \Exception("Client's detail not found");
            }
            $last_log = $this->AdminClientModel->getClientLastPlanLog($this->input['client_id']);
            if(!$last_log['status']) {
                throw new \Exception($last_log['error']);
            }
            $new_log = $this->AdminClientModel->preparePlanLogData($this->input, $last_log['data'], $this->input['action']);
            if(!$new_log['status']) {
                throw new \Exception($new_log['error']);
            }
            $new_log['data']['client_id'] = $this->input['client_id'];
            $payment = [];
            if(!empty($this->input['amount']) && !empty($this->input['payment_date'])) {
                $payment = [
                    "payment_date"=> date('Y-m-d', strtotime($this->input['payment_date'])),
                    "amount"=>$this->input['amount'],
                    "client_id"=>$this->input['client_id']
                ];
                if(!empty($this->input['transaction_no'])) {
                    $payment['transaction_no'] = $this->input['transaction_no'];
                }
                if(!empty($this->input['remark'])) {
                    $payment['remark'] = $this->input['remark'];
                }
            }

            $clupdate = [
                'plan_id'=>$this->input['plan_id'], 
                'user_count'=>$new_log['data']['user_count'], 
                'add_on_agent'=>$new_log['data']['add_on_agent'], 
                'plan_price'=>$new_log['data']['plan_price'], 
                'add_on_price'=>$new_log['data']['add_on_price'], 
                'plan_start_date' => date('Y-m-d', strtotime($this->input['plan_validity'][0])), 
                'plan_end_date' => date('Y-m-d', strtotime($this->input['plan_validity'][1])), 
            ];
            if($this->input['action'] == "UPDATE") {
                $clupdate['valid_from'] =  date('Y-m-d', strtotime($this->input['plan_validity'][0]));
                $clupdate['valid_date'] =  date('Y-m-d', strtotime($this->input['plan_validity'][1]));
            } else {
                $clupdate['valid_date'] =  date('Y-m-d', strtotime($this->input['plan_validity'][1]));
            }
            $log = $this->AdminClientModel->renewUpdateClientPlan($new_log['data'], $clupdate, $payment);
            if(!$log['status']) {
                throw new \Exception($log['error']);
            } else {
                $this->sendResponse(array('code' => 200, 'message' => ($this->input['action'] == "UPDATE") ? "Client's plan has been updated successfully": "Client's plan has been renewed successfully", 'data'=> null));
            }
        } catch(\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line'=>$e->getLine()]);
            $this->sendResponse(array('code' => 400, 'message' => $e->getMessage(), 'data'=> null));
        }
    }

    public function generateClientToken() {
        try {
            $token = Utilities::getClientToken();
            if(empty($token['status'])) {
                throw new \Exception($token['error']);
            }
            $this->sendResponse(array('code' => 200, 'message' => null, 'data'=> $token['data']));
        } catch(\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line'=>$e->getLine()]);
            $this->sendResponse(array('code' => 400, 'message' => $e->getMessage(), 'data'=> null));
        }
    }
}