<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Mail\ShareRechargeEmail;
use App\Recharge as AppRecharge;
use App\Http\Controllers\Comission\DeductRechargeComission;
use App\Region_code;
use App\User;
use App\Wallet;
use App\AccessToken;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Crypt;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\DB;

//use App\Operator;
use App\Circle;
use App\memberType;
use App\Recharge;
use App\RechargeComission;
use App\CCrecharge;
use App\RechargePlan;
use Exception;
use Validator;

class RechargeController extends Controller
{    
    public function __construct()
    {
       // $this->middleware('tokencheck');
        $token = Http::withHeaders([
            "Accept" => "application/json",
            "Content-Type" => "application/json",
        ])->timeout(30)->post(env('AepsUrl') . "api/auth/login", [
            "email" => env("AepsUser"),
            "password" => env("AepsPassword"),
            "domain" => url("/") . "/",

        ]);
        $tokenResponse = $token->json();
        
        if ($token->ok()) 
        {
            $tokenResponse = $token->json();
            $services = $tokenResponse["userservice"];
            foreach ($services as $key => $se) {
                $this->services[] = $se["service"];
                $this->services_sta[$se["service"]] = $se["status"];

            }
            $this->token = $tokenResponse["access_token"];
            $this->exp_time = $tokenResponse["expires_in"];
            $this->aepsToken = $tokenResponse["aepsToken"];
            $this->parentUser = $tokenResponse["id"];
        }
        else 
        {
            abort(500);
        }

        // Check Access Token 
        $tokenId = $_SERVER['HTTP_API_AUTH'];          
        $accessToken = AccessToken::where('token', $tokenId)->first();  
        if (empty($accessToken)) {
            $error = array(
                'status' => 'error',
                'error' => array(
                    'version' => 'DIOS-0.1',                    
                    'responseCode' => 202,
                    'errorCode' => 403,
                    'message' => 'Unauthorizes',
                )
            );
            return response()->json($error, 403);
        }
        $this->accessTokenUserId = $accessToken->user_id;
    }

    public function recharge(Request $request) { 
        // Check Access Token 
        $tokenId = $_SERVER['HTTP_API_AUTH'];          
        $accessToken = AccessToken::where('token', $tokenId)->first();  
        if (empty($accessToken)) {
            $error = array(
                'status' => 'error',
                'error' => array(
                    'version' => 'DIOS-0.1',                    
                    'responseCode' => 202,
                    'errorCode' => 403,
                    'message' => 'Unauthorizes',
                )
            );
            return response()->json($error, 403);
        }

        // Encryted Key
        $mobileKey = Crypt::encrypt('Mobile');        
        // Get Walet Amount       
        $walletSumCreditAmount = Wallet::where('user_id', $accessToken->user_id)->where('type', 0)->sum('amount'); 
        $walletSumDebitAmount = Wallet::where('user_id', $accessToken->user_id)->where('type', 1)->sum('amount');  
        $totalAmount = $walletSumCreditAmount-$walletSumDebitAmount;
        $walletBalance = number_format($totalAmount, 2,'.',''); 
        // return $walletBalance;
		if ($walletBalance <= 0) {
            $arrayData = array(
                'version' => 'DIOS-0.1',
                'responseCode' => 202,
                'message' => 'Your Wallet Balance Is Low, Kindly Recharge Your Wallet (आपका वॉलेट बैलेंस कम है, कृपया अपने वॉलेट को रिचार्ज करें)',
                'data' => ''                   
            ); 
            return response()->json($arrayData);
        }         
		
		$tpin = $request->tpin;
		$users = User::where(["id" => $accessToken->user_id])->first();
		if(!empty($users->tpin)){
			if($users->tpin!=$tpin){				
                $arrayData = array(
                    'version' => 'DIOS-0.1',
                    'responseCode' => 202,
                    'message' => 'Tpin Invalid.you can generate forgot tpin on login form.',
                    'data' => ''                   
                ); 
                return response()->json($arrayData);
			}			
		}
		else
		{
            $arrayData = array(
                'version' => 'DIOS-0.1',
                'responseCode' => 202,
                'message' => 'Tpin Invalid.you can generate forgot tpin on login form.',
                'data' => ''                   
            ); 
            return response()->json($arrayData);			
		}
		
        $rechargePlan = RechargePlan::where("code", $request->operator)->where("amount", $request->amount)->first();
        if(empty($rechargePlan))
        {
            $arrayData = array(
                'version' => 'DIOS-0.1',
                'responseCode' => 202,
                'message' => 'This recharge plan rs '.$request->amount.' is not available',
                'data' => ''                   
            ); 
            return response()->json($arrayData);    
        }
		// dd($rechargePlan);
        $operatoCode = AppRecharge::where('code', $request->operator)->first();        
        // dd($rechargeConmissionDone);
        $randId = 	$orderId = 'RCH' . round(microtime(true) * 1000);
        $userId = env('DIGITALUSERNAME');
        $password = env('DIGITALPASSWORD');
        $smsPin = env('DIGITALPIN');
        $customerno = $request->mobile_number;
        $amount = $request->amount;
        $operatorcode = $request->operator; 
		$st = Crypt::decrypt($mobileKey);
        $rechargeType = 'S';
		
		$walletremaining = $walletBalance - $amount;
         
        
        if ($walletremaining < 0) {
            $arrayData = array(
                'version' => 'DIOS-0.1',
                'responseCode' => 202,
                'message' => 'Kindly enter amount less than total balance (कुल बैलेंस से कम राशि दर्ज करें)',
                'data' => ''                   
            ); 
            return response()->json($arrayData);              
        }
		
		$apiProPayout = Http::withToken($this->token)->withHeaders([
				"Accept" => "application/json",
				"Content-Type" => "application/json",
			])->timeout(30)->post(env('AepsUrl') . "api/auth/getRechargeBalance", [
				'user_id' => $this->parentUser,
		]);
		$apiProPayout = json_decode($apiProPayout->body());
	
		if ($apiProPayout->status == 1) {
			$totalPayoutAmount = $apiProPayout->balance;
			$walletremaining1 = $totalPayoutAmount-$amount;
			if ($walletremaining1 < 0) {
                $arrayData = array(
                    'version' => 'DIOS-0.1',
                    'responseCode' => 202,
                    'message' => 'Service down from bank, Contact Administrator',
                    'data' => ''                   
                ); 
                return response()->json($arrayData);  				
			}
			
		}
        $comments = $st." Recharge payment of ".$operatoCode->name;
        // Entry in wallet 
        Wallet::create([
            "user_id" => $accessToken->user_id, 
            "method" => $comments, 
            "type" => 1, 
            "amount" => $amount, 
            "transaction_id" => $orderId,
            "created_at" => date("Y-m-d H:i:s"), 
            "updated_at" => date("Y-m-d H:i:s")
        ]); 
		$princeRemainingBalance = $this->checkDisbursalAccountBalance();
		if ($princeRemainingBalance > 0 && (float) $princeRemainingBalance > $amount) {	
            $statusC = 'PENDING';  
            if($statusC=='PENDING'){
                $st1 = $st;
                if($st=='Mobile'){
                    $st1 = 'Prepaid';
                }
                $payoutTransactions = Http::withToken($this->token)->withHeaders([
                        "Accept" => "application/json",
                        "Content-Type" => "application/json",
                    ])->timeout(30)->post(env('AepsUrl') . "api/auth/recharge/store_recharge", [
                        'user_id' => $this->parentUser,
                        'loginId' => $users->loginId,
                        "mobile" => $customerno,
                        "transaction_id" => $orderId,
                        "operatorRef" => request()->input("operator"),
                        "ApiTransID"=>$orderId,
                        "operator" => $operatoCode->code,
                        "statusC" => $statusC,
                        "amount" => $amount,
                        "service" => $st1,
                        "ErrorCode" => "Transaction Successful.",
                        "created_at" => date("Y-m-d H:i:s"),
                        "updated_at" => date("Y-m-d H:i:s")
                ]);
                $payoutTransactions = json_decode($payoutTransactions->body());
                if ($payoutTransactions->status == 1) {                 
                    // Deduct Recharge Amount
                    // DeductRechargeComission::index(
     //                    $users->member_type, 
     //                    $amount, 
     //                    $operatoCode->code, 
     //                    $operatoCode->service,
     //                    $orderId,
     //                    $accessToken->user_id
     //                );
                }                           
            } 
		
			$endPoint = "https://www.digitalpaymentindia.com/Admin/RechargeAPI.aspx?UserID=".$userId."&Password=".$password."&MobileNo=".$userId."&Message=".$operatorcode."$".$customerno."$".$amount."$".$smsPin."$".$rechargeType."$".$randId;
			$response = Http::get("https://www.digitalpaymentindia.com/Admin/RechargeAPI.aspx?UserID=".$userId."&Password=".$password."&MobileNo=".$userId."&Message=".$operatorcode."$".$customerno."$".$amount."$".$smsPin."$".$rechargeType."$".$randId); 
			
			//Logs
			$currenttime=time();
			$result_date=date("d/m/Y",$currenttime);
			$result_time=date("h:i:s A",$currenttime);

			//$timestamp_today=1493231400;
			$timestamp_today=strtotime("midnight");
			$name_date=date("Md",$timestamp_today);
			$lookup=$timestamp_today+86400;
			if($currenttime<$lookup){
				$name=$name_date;
			}
			elseif($currenttime>$lookup){
				$result_date=date("M d",$lookup);
				$name=$result_date;
			}
			$refile = fopen("rechargelogs/".$name.".txt", "a+") or time();

			fwrite($refile, 'Current Date=' . $result_date  . "; \n");
			fwrite($refile, 'Current Time=' . $result_time  . "; \n");
			fwrite($refile, 'Remote Ip address=' . $_SERVER['SERVER_ADDR']  . "; \n");
			fwrite($refile, 'User Agent=' . $_SERVER['HTTP_USER_AGENT']  . "; \n");
			fwrite($refile, '-----------------STARTS HERE------------------\n');
			fwrite($refile, 'Request=' . $endPoint . "; \n");
			fwrite($refile, 'Response=' . $response . "; \n");

			fwrite($refile, '------------**************************---------');
			fwrite($refile, '----------------------------------');
			fclose($refile);
			
			// end logs
			// return $response;
			// $statusC = 'FAILURE';
			// $statusC = 'PENDING';			
			if(!empty($response)){
				$responseArr = explode("=",$response);
				if(isset($responseArr[0])){
					if($responseArr[0]=='0'){
						$statusC = 'PENDING';
					}
				}
			
			}
			$cRecharge = new CCrecharge;
			$cRecharge->user_id = $accessToken->user_id;
			$cRecharge->mobile = $customerno;
			$cRecharge->transaction_id = $orderId;
			$cRecharge->amount = $amount;
			$cRecharge->operatorRef = $operatoCode->code;
			$cRecharge->operator = $operatoCode->name;
			$cRecharge->regionCode = $request->circle;
			$cRecharge->statusC = $statusC;
			$cRecharge->save();
			if($statusC=='PENDING'){
				// $st1 = $st;
				// if($st=='Mobile'){
				// 	$st1 = 'Prepaid';
				// }
				// $payoutTransactions = Http::withToken($this->token)->withHeaders([
    // 					"Accept" => "application/json",
    // 					"Content-Type" => "application/json",
				// 	])->timeout(30)->post(env('AepsUrl') . "api/auth/recharge/store_recharge", [
    // 					'user_id' => $this->parentUser,
    // 					'loginId' => $users->loginId,
    // 					"mobile" => $customerno,
    // 					"transaction_id" => $orderId,
    // 					"operatorRef" => request()->input("operator"),
    // 					"ApiTransID"=>$orderId,
    // 					"operator" => $operatoCode->code,
    // 					"statusC" => $statusC,
    // 					"amount" => $amount,
    // 					"service" => $st1,
    // 					"ErrorCode" => "Transaction Successful.",
    // 					"created_at" => date("Y-m-d H:i:s"),
    // 					"updated_at" => date("Y-m-d H:i:s")
				// ]);
				// $payoutTransactions = json_decode($payoutTransactions->body());
				// if ($payoutTransactions->status == 1) {					
    //                 // Deduct Recharge Amount
				// 	// DeductRechargeComission::index(
    //  //                    $users->member_type, 
    //  //                    $amount, 
    //  //                    $operatoCode->code, 
    //  //                    $operatoCode->service,
    //  //                    $orderId,
    //  //                    $accessToken->user_id
    //  //                );
				// }
                // ============================================
                $arrayData = array(
                    'version' => 'DIOS-0.1',
                    'responseCode' => 200,
                    'message' => 'Success!, Recharge Accepted successfully',
                    'data' => $cRecharge               
                ); 				
			}
			else
			{
                $arrayData = array(
                    'version' => 'DIOS-0.1',
                    'responseCode' => 202,
                    'message' => 'Failed! Recharge Not Done',
                    'data' => ''                   
                ); 
			}
		}
		else 
		{
            $arrayData = array(
                'version' => 'DIOS-0.1',
                'responseCode' => 202,
                'message' => 'Failed! Service down from bank, Contact Administrator',
                'data' => ''                   
            ); 			
		}

        return response()->json($arrayData);
    }

    private function checkDisbursalAccountBalance()
    {
        $userId = env('DIGITALUSERNAME');
        $password = env('DIGITALPASSWORD');
        $smsPin = env('DIGITALPIN');
        $response = Http::get("https://www.digitalpaymentindia.com/Admin/RechargeAPI.aspx?UserID=".$userId."&Password=".$password."&MobileNo=".$userId."&Message=BAL$".$smsPin);
        $balance = 0;
        if(!empty($response)){
            $responseArr = explode("=",$response);
            if(isset($responseArr[0])){
                if($responseArr[0]=='0'){
                    $balance = $responseArr[1];
                }
            }
            
        }
        return $balance;
    } 
	
	public function getOperators()
    {
        // Check Access Token 
        $tokenId = $_SERVER['HTTP_API_AUTH'];          
        $accessToken = AccessToken::where('token', $tokenId)->first();  
        if (empty($accessToken)) {
            $error = array(
                'status' => 'error',
                'error' => array(
                    'version' => 'DIOS-0.1',                    
                    'responseCode' => 202,
                    'errorCode' => 403,
                    'message' => 'Unauthorizes',
                )
            );
            return response()->json($error, 403);
        }

        $prepaidRecharge = AppRecharge::where('service', 'Mobile')->get();
        $dthRecharge = AppRecharge::where('service', 'DTH')->get();   
        try {
            $arrayData = array(
                'version' => 'DIOS-0.1',
                'responseCode' => 200,
                'message' => 'Get Operator data retrived successfully!',
                'data' => [
                    'mobile' => $prepaidRecharge,  
                    'dth' => $dthRecharge                 
                ]                    
            ); 
        } catch (Exception $e) {
            $arrayData = array(
                'version' => 'DIOS-0.1',
                'responseCode' => 202,
                'message' => $e->getMessage(),
                'data' => ''                    
            ); 
        }

        return response()->json($arrayData);
    }

    public function getCircles()
    {
        // Check Access Token 
        $tokenId = $_SERVER['HTTP_API_AUTH'];          
        $accessToken = AccessToken::where('token', $tokenId)->first();  
        if (empty($accessToken)) {
            $error = array(
                'status' => 'error',
                'error' => array(
                    'version' => 'DIOS-0.1',                    
                    'responseCode' => 202,
                    'errorCode' => 403,
                    'message' => 'Unauthorizes',
                )
            );
            return response()->json($error, 403);
        }

        $areaCircle = Circle::all();
        if($areaCircle)
        {
            try {
                $arrayData = array(
                    'version' => 'DIOS-0.1',
                    'responseCode' => 200,
                    'message' => 'Get Operator data retrived successfully!',
                    'data' => $areaCircle        
                ); 
            } catch (Exception $e) {
                $arrayData = array(
                    'version' => 'DIOS-0.1',
                    'responseCode' => 202,
                    'message' => $e->getMessage(),
                    'data' => ''                    
                ); 
            }
        } else {
            $arrayData = array(
                'version' => 'DIOS-0.1',
                'responseCode' => 202,
                'message' => 'Data Not Found!',
                'data' => ''                    
            ); 
        }
        return response()->json($arrayData);
    }

    public function getRechargeTrasaction(Request $request)
    {
        // Check Access Token 
        $tokenId = $_SERVER['HTTP_API_AUTH'];          
        $accessToken = AccessToken::where('token', $tokenId)->first();  
        if (empty($accessToken)) {
            $error = array(
                'status' => 'error',
                'error' => array(
                    'version' => 'DIOS-0.1',                    
                    'responseCode' => 202,
                    'errorCode' => 403,
                    'message' => 'Unauthorizes',
                )
            );
            return response()->json($error, 403);
        }

        // $validateData = Validator::make($request->all(), [
        //     'userId' => 'required'
        // ]);

        // if($validateData->fails())
        // {
        //     $arrayData = array(
        //         'version' => 'DIOS-0.1',
        //         'responseCode' => 202,
        //         'message' => 'Member id is required',
        //         'data' => ''                    
        //     ); 
        //     return response()->json($arrayData);
        // }

        $userId = $accessToken->user_id;
        $limit = $request->limit;
        $startDate = $request->start_date;
        $endDate = $request->end_date;         
        // $rechargeTrasaction = CCrecharge::where('user_id', $userId)->newQuery();  
        $rechargeTrasaction = DB::table('crecharges')->where('user_id', $userId);
        if($startDate)
        {
            $rechargeTrasaction->whereDate("created_at", ">=", $startDate);  
        }
        if($endDate)
        {
            $rechargeTrasaction->whereDate("created_at", "<=", $endDate);  
        }
        if($limit)
        {
            $rechargeTrasaction->limit($limit); 
        } 
        if (!$startDate && !$endDate) {
            $date = date("Y-m-d");                
            $rechargeTrasaction->whereDate("updated_at", ">=", $date);
        }
        $rechargeTrasaction = $rechargeTrasaction->orderBy('id', 'DESC')->get();                   

        if($rechargeTrasaction)
        {
            try {
                $arrayData = array(
                    'version' => 'DIOS-0.1',
                    'responseCode' => 200,
                    'message' => 'Get Recharge Transactions data retrived successfully!',
                    'data' => $rechargeTrasaction       
                ); 
            } catch (Exception $e) {
                $arrayData = array(
                    'version' => 'DIOS-0.1',
                    'responseCode' => 202,
                    'message' => $e->getMessage(),
                    'data' => ''                    
                ); 
            }
        }
        else
        {
            $arrayData = array(
                'version' => 'DIOS-0.1',
                'responseCode' => 202,
                'message' => 'Data Not Found!',
                'data' => ''                    
            );             
        }
        return response()->json($arrayData);
    }

    public function getPlans($opCode)
    {
        $userId = $this->accessTokenUserId;
        $operatorCodeDetails = RechargePlan::where("code", $opCode)->get();
        try {
            if ($operatorCodeDetails) {
                $arrayData = array(
                    'version' => 'DIOS-0.1',
                    'responseCode' => 200,
                    'message' => 'Get Operator Details successfully!',
                    'data' => $operatorCodeDetails                   
                );
            } else {
                $arrayData = array(
                    'version' => 'DIOS-0.1',
                    'responseCode' => 202,
                    'message' => 'Something went wrong! data not found',
                    'data' => ''                  
                );
            }            
        } catch (Exception $e) {
            $arrayData = array(
                'version' => 'DIOS-0.1',
                'responseCode' => 202,
                'message' => $e->getMessage(),
                'data' => ''                    
            );
        }
        return response()->json($arrayData);
    }
	
}
