<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Validator;
use Illuminate\Http\Request;
use App\Models\Notification;
use App\Models\NotificationDetail;
use App\Models\Auth\User;
use App\Models\Auth\UserDeviceToken;
use App\Models\Circle;
use App\Models\CircleUser;
use App\Models\SiteSettings;
use DB;
use FFI;
use Illuminate\Support\Facades\Storage;
use File;
use App\Models\NotificationImg;

class NotificationController extends Controller {

    public function __construct()
    {
        
    }

    public function index() 
    {
        $messages = Notification::orderBy('created_at', 'DESC')->get();
        return view('admin.pages.notification.list', compact('messages'));
    }

    public function create() 
    {
        $circles = Circle::where('status','>', 1)->orderBy('created_at', 'DESC')->get();
        $users = User::where('status', 1)->groupBy('mobile_number')->orderBy('created_at', 'DESC')->get();
       
        $files=NotificationImg::get();
      
        //dd($files);
        return view('admin.pages.notification.add', compact('users','circles','files'));
    }

    public function getUsers(Request $req)
    {
        $circle_code = $req->circle_code;
        if($circle_code) {
            $data = CircleUser::leftJoin('users', 'circle_users.mobile_number','=','users.mobile_number')->where('circle_code',$circle_code)->select(DB::raw('users.id,first_name,last_name,users.mobile_country_code,users.mobile_number,circle_users.mobile_number as number,circle_users.mobile_country_code as country_code,username'))->groupBy('circle_users.mobile_number')->get();
        } else {
            $data = User::where('status', 1)->groupBy('mobile_number')->orderBy('created_at', 'DESC')->get();
        }
        if(count($data)>0) {
            $html = '<option value="">Choose Users</option>';
            foreach ($data as $key => $value) {
            $html .= '<option value="'.$value->id.'">';
                if($value->first_name) {
            $html .=  $value->first_name.' '.$value->last_name.' ('.$value->mobile_country_code.$value->mobile_number.')';
                } elseif($value->username) {
            $html .=  $value->username.' ('.$value->country_code.$value->number.')';
                }
            $html .= '</option>';
            } 
            $response = ['status'=>200, 'data'=>$html];
        } else {
            $response = ['status'=>201, 'data'=>[]];
        }
        return response()->json($response);
    }

    public function send(Request $req) {
     // dd($req->notification_icon->getClientOriginalExtension());
        if($req->post()) {
            $rules = array(
                //'circle' => 'required_without:user',
                //'user' => 'required_without:circle',
                'content' => 'required',
            );
            $messages = array();
            $validator = Validator::make($req->all(), $rules, $messages);
            if ($validator->fails())
            {
                $failedRules = $validator->failed();
                return redirect('/admin/notification/create')->withErrors($validator);
            }
            else
            {
               
               
               
              
                
              // dd($req);
                $circle_code = '';
                $distribution_type = $req->distribution_type1 ? 1 : 0;                
                if($distribution_type == 1) {
                    $arr = [
                        'user_id'=>NULL,
                        'username'=>'All Users',
                        'distribution_type'=>2,
                        'notification_mode'=>2,
                        'message'=>$req->content,
                        'circle_code'=>0,
                        'read_status'=>0,
                        'read_time'=>'',
                        'show_on_phone'=>1,
                    ];
                    if($req->notification_icon) {
                       
                        $arr['notification_icon'] = $req->notification_icon;
                    }
                    $inserted = Notification::create($arr);
                   // dd( $inserted);
                    $users = User::where('status', 1)->groupBy('mobile_number')->orderBy('created_at', 'DESC')->get();

                    if($users && $inserted) {
                        foreach ($users as $key => $user) {
                            NotificationDetail::insert([
                                'send_user_id'=>$user->id,
                                'notification_id'=>$inserted->id,
                                'read_status'=>0,
                                'read_time'=>'',
                                'created_at'=>now(),
                                'updated_at'=>now(),
                            ]);
                        }
                    }
                } else {
                    if($req->user) {
                        $users = User::whereRaw('id in ('.implode(',',$req->user).')')->get();
                    } elseif($req->circle) {
                        $circle_code = $req->circle;
                        $users = CircleUser::leftJoin('users', 'circle_users.mobile_number','=','users.mobile_number')->where('circle_code',$req->circle)->select(DB::raw('users.id,first_name,last_name, users.mobile_country_code,users.mobile_number,circle_users.mobile_number as number,circle_users.mobile_country_code as country_code,username'))->groupBy('circle_users.mobile_number')->get();
                    }
                }
                if(count($users)>0){
                    $tokens = [];
                    $insertArr = [];
                    foreach ($users as $key => $value) {
                        if($distribution_type == 0) {
                            $mainarr = [
                                'user_id'=>$value->id ? $value->id : ($value->user_id ? $value->user_id : ''),
                                'username'=>$value->first_name ? $value->first_name.' '.$value->last_name : ($value->username ? $value->username : ''),
                                'distribution_type'=>1,
                                'notification_mode'=>2,
                                'message'=>$req->content,
                                'circle_code'=>$circle_code,
                                'read_status'=>0,
                                'read_time'=>'',
                                'show_on_phone'=>1,
                            ];
                            if($req->notification_icon) {
                                $mainarr['notification_icon'] = $req->notification_icon;
                            }
                            array_push($insertArr, $mainarr);
                        }
                        $userDevice = UserDeviceToken::where('user_id', $value->id)->first();
                        if($userDevice){   
                            array_push($tokens, $userDevice->device_tokens);                         
                        }
                    } 
                    if(count($insertArr) > 0 && $distribution_type == 0) { 
                        $insert = Notification::insert($insertArr);
                    }
                    if(count($tokens) > 0) {
                        $content = array(
                            "en" => $req->content
                        );
                        $response = $this->notification($tokens, $circle_code, $content, 1, $distribution_type);       
                    }         
                }
            }
            return redirect('admin/notification')->withSuccess('Notification send');   
        }        
    }

    public function notification($device_tokens='', $circle_code='', $content='', $show_on_phone=0, $distribution_type=0)
    {
        if($device_tokens==''){
            $device_tokens=['64a105c1-296f-42ba-a4fe-db59541a979f'];
        }
        $details = SiteSettings::where('keyword', 'one_signal_app_id')->first();
        $one_signal_app_id = $details ? $details->value : 'a7be7046-5ab6-447c-bc1e-0d95d1217191';
        $fields = array(
            'app_id' => $one_signal_app_id,
            'include_player_ids' => $device_tokens,
            'data' => array("notification_type" => "joining_notification", "circle_code" => $circle_code),
            'contents' => $content
        );
        
        $fields = json_encode($fields);
        //print("\nJSON sent:\n");
        //print_r($fields);
        
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, "https://onesignal.com/api/v1/notifications");
        //curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json; charset=utf-8'));
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json; charset=utf-8',
                                       'Authorization: Basic NDExNGIwY2UtM2JiYS00MjZmLTg1MzAtYzlmZmY4MjA5YzI0'));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($ch, CURLOPT_HEADER, FALSE);
        curl_setopt($ch, CURLOPT_POST, TRUE);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);

        $response = curl_exec($ch);
        curl_close($ch);
        
        $output = (array)json_decode($response);
        //print_r($output);die;
        if($output){
            if(isset($output['recipients'])){
                return $output['recipients'];
            } else {
                return 0;
            }
        } else {
            return 0;
        }
    }
}
