<?php

namespace App\Http\Controllers;

use App\AuditTrail;
use App\Http\Requests;
use App\Jobs\SendNewRegistrationNotification;
use App\Role;
use App\Tools\SmsTools;
use App\Transaction;
use App\User;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Input;
use Illuminate\Support\Facades\Response;
use Intervention\Image\Facades\Image;

class ApiLoginController extends Controller
{
    public function stat(Request $request)
    {
        $username = $request['username'];
        $password = $request['password'];

        if (empty($username)) {
            return [
                'code' => 402,
                'message' => 'The username is required'
            ];
        }
        if (empty($password)) {
            return [
                'code' => 402,
                'message' => 'The password is required'
            ];
        }

        if (!Auth::once([
            'username' => $username,
            'password' => $password
        ])
        ) {
            return [
                'code' => 401,
                'message' => 'Invalid Credential'
            ];
        }

        //get current user
        $user = Auth::user();

        $date = Carbon::now();
        $from_date = Carbon::parse($date->toDateString());
        $to_date = clone $from_date;
        $to_date = Carbon::parse($to_date->addDays(1)->addSeconds(-1));
        $type = $request['type'];

        if ($type == 'month') {
            $from_date = $from_date->setDate($from_date->year, $from_date->month, 1);
            $to_date = Carbon::parse($from_date->copy()->addMonth()->addSeconds(-1));
            $dash_title = 'Monthly Dashboard';
        } else if ($type == 'week') {
            $from_date = $this->get_weekly_start_day();
            $to_date = $this->get_weekly_end_day();
            $dash_title = 'Weekly Dashboard';
        } else {
            $date = $this->get_date_by_day_name($type);
            $from_date->setDate($date->year, $date->month, $date->day);
            $to_date->setDate($date->year, $date->month, $date->day);
            $dash_title = ucfirst($this->get_day_full_name($type)) . ' \'s Dashboard';
        }
        if ($type == null) {

            $date = Carbon::now();
            $from_date->setDate($date->year, $date->month, $date->day);
            $to_date->setDate($date->year, $date->month, $date->day);
            $dash_title = ucfirst($type) . 'Today Dashboard';
        }

        $data = DB::table('logs')->select(DB::raw('logs.status, count(*) as total'))
            ->where('user_id', '=', $user->id)
            ->whereBetween('submit_date', [$from_date, $to_date])
            ->groupBy('status')->get();

        $tempArray = [];
        foreach ($data as $dat) {
            $status = $dat->status;
            $total = $dat->total;
            $tempArray["{$status}"] = $total;
        }

        $total_sms_sent = $user->logs()->whereBetween('submit_date', [
            $from_date->toDateTimeString(),
            $to_date->toDateTimeString()
        ])->count();

        $total_sms_delivered = isset($tempArray['DELIVRD']) ? $tempArray['DELIVRD'] : 0;
        $total_sms_ack = isset($tempArray['ACK/']) ? $tempArray['ACK/'] : 0;
        $total_sms_undelivered = isset($tempArray['UNDELIV']) ? $tempArray['UNDELIV'] : 0;
        $total_sms_expired = isset($tempArray['EXPIRED']) ? $tempArray['EXPIRED'] : 0;

        return [
            'code' => 0,
            'dash_title' => $dash_title,
            'total_sms_sent' => $total_sms_sent,
            'total_sms_delivered' => $total_sms_delivered,
            'total_sms_ack' => $total_sms_ack,
            'total_sms_undelivered' => $total_sms_undelivered,
            'total_sms_expired' => $total_sms_expired,
            'total_balance' => (double)$user->credit->new_bal
        ];
    }

    private function get_day_full_name($day)
    {
        $day = strtolower($day);

        switch ($day) {
            case 'sun':
                return 'Sunday';
                break;
            case 'mon':
                return 'Monday';
                break;
            case 'tue':
                return 'Tuesday';
                break;
            case 'wed':
                return 'Wednesday';
                break;
            case 'thu':
                return 'Thursday';
                break;
            case 'fri':
                return 'Friday';
                break;
            case 'sat':
                return 'Saturday';
                break;
            default:
                return 'N / A';
                break;
        }
    }

    private function get_date_by_day_name($day_name)
    {
        $now = Carbon::now()->addDays(-1);
        switch ($day_name) {
            case 'sun':
                while (!$now->isSunday()) {
                    $now = $now->addDays(-1);
                }
                return $now;
            case 'mon':
                while (!$now->isMonday()) {
                    $now = $now->addDays(-1);
                }
                return $now;
            case 'tue':
                while (!$now->isTuesday()) {
                    $now = $now->addDays(-1);
                }
                return $now;
            case 'wed':
                while (!$now->isWednesday()) {
                    $now = $now->addDays(-1);
                }
                return $now;
            case 'thu':
                while (!$now->isThursday()) {
                    $now = $now->addDays(-1);
                }
                return $now;
            case 'fri':
                while (!$now->isFriday()) {
                    $now = $now->addDays(-1);
                }
                return $now;
            case 'sat':
                while (!$now->isSaturday()) {
                    $now = $now->addDays(-1);
                }
                return $now;
            default:
                return $now;
        }
    }

    private function get_weekly_start_day()
    {
        $date = Carbon::now()->setTime(0, 0, 0);
        while (!$date->isMonday()) {
            $date = $date->addDays(-1);
        }
        return $date;
    }

    private function get_weekly_end_day()
    {
        $date = Carbon::now()->setTime(23, 59, 59);
        while (!$date->isSunday()) {
            $date = $date->addDays(1);
        }
        return $date;
    }

    public function login(Request $request)
    {
        //validate request
        $username = $request['username'];
        $password = $request['password'];

        if (empty($username)) {
            return [
                'code' => 401,
                'message' => 'The username is required'
            ];
        }

        if (empty($password)) {
            return [
                'code' => 401,
                'message' => 'The password is required'
            ];
        }

        // get our login input
        $login = $request->input('username');

        // check login field
        $login_type = filter_var($login, FILTER_VALIDATE_EMAIL) ? 'email' : 'username';

        // merge our login field into the request with either email or username as key
        $request->merge([$login_type => $login]);

        $credentials = $request->only($login_type, 'password');

        $credentials['role_id'] = Role::where('name', 'user')->firstOrFail()->id;

        //check the user trying to login
        if (isset($credentials['username']) && !empty($credentials['username']))
            $user = User::where([
                ['role_id', '=', $credentials['role_id']],
                ['username', '=', $credentials['username']]
            ])->first();
        else
            $user = User::where([
                ['role_id', '=', $credentials['role_id']],
                ['email', '=', $credentials['email']]
            ])->first();

        if (!empty($user) && $user->is_locked) {
            //process locked user
            return [
                'code' => 401,
                'message' => 'Your account has been locked!'
            ];
        }

        if (!Auth::once([
            'username' => $username,
            'password' => $password
        ])
        ) {
            if (!empty($user)) {
                if (empty($user->wrong_password_attempt_count)) {
                    $user->wrong_password_attempt_count = 0;
                }
                $user->wrong_password_attempt_count++;
                //lock user password after 21 trial
                if ($user->wrong_password_attempt_count >= 30) {
                    $user->is_locked = true;
                }
                $user->save();
            }
            return [
                'code' => 401,
                'message' => 'Invalid Credential!'
            ];
        } else {
            $user = Auth::user();
            if (empty($user->wrong_password_attempt_count)) {
                $user->wrong_password_attempt_count = 0;
            }
            if ($user->wrong_password_attempt_count > 0) {
                $user->wrong_password_attempt_count = 0;
                $user->save();
            }

            //update audit_trail
            AuditTrail::create([
                'user_id' => $user->id,
                'username' => $user->username,
                'date' => Carbon::now()->toDateTimeString(),
                'activity' => $user->name . ' logged in via mobile app '
            ]);

            return [
                'code' => 0,
                'message' => 'Successful Login',
                'username' => $user->username,
                'user_id' => $user->id,
                'bal' => $user->credit->new_bal
            ];
        }
    }

    public function register(Request $request)
    {
        //validate request
        $name = $request['name'];
        $email = $request['email'];
        $phone_number = $request['phone_number'];
        $username = $request['username'];
        $password = $request['password'];

        if (empty($name)) {
            return [
                'code' => 401,
                'message' => 'The name is required'
            ];
        }
        if (empty($email)) {
            return [
                'code' => 401,
                'message' => 'The email is required'
            ];
        }
        if (empty($phone_number)) {
            return [
                'code' => 401,
                'message' => 'The phone number is required'
            ];
        }
        if (empty($username)) {
            return [
                'code' => 401,
                'message' => 'The username is required'
            ];
        }
        if (empty($password)) {
            return [
                'code' => 401,
                'message' => 'The password is required'
            ];
        }

        if (!empty(User::where('username', $username)->first())) {
            return [
                'code' => 401,
                'message' => 'The username already exists!'
            ];
        }
        if (!empty(User::where('email', $email)->first())) {
            return [
                'code' => 401,
                'message' => 'The email address already exists!'
            ];
        }

        //get first name and last name
        $inputs = [
            'full_name' => $name,
            'email' => $email,
            'username' => $username,
            'password' => $password,
            'phone_number' => $phone_number
        ];
        $parts = explode(" ", $name);
        $inputs['first_name'] = array_pop($parts);
        $inputs['last_name'] = implode(" ", $parts);
        $inputs['pass'] = $password;
        $inputs['status'] = 'active';
        $inputs['created_by'] = 'mobile';

        //format the phone number
        $inputs['phone_number'] = SmsTools::format_gh_number($phone_number);

        //encrypt the password
        $inputs['password'] = bcrypt($password);

        //set the user role
        $role = Role::where('name', 'user')->firstOrFail();
        $inputs['role_id'] = $role->id;

        //create the client
        $user = User::create($inputs);

        //credit new client
        $user->credit()->create([
            'username' => $user->username,
            'price' => 0.032,
            'credit_alloted' => 0.15,
            'old_bal' => 0,
            'new_bal' => 0.15,
            'credit_used' => 0,
            'credited' => 0
        ]);

        //update picture
        if (isset($request['picture']) && !empty($request['picture'])) {
            $file = Input::file('picture');
            $img = Image::make($file)->resize(400, 400);
            Response::make($img->encode('jpeg'));
            $user->picture()->create(['picture' => $img]);
        }

        //Send email & sms notification to user
        $job = new SendNewRegistrationNotification($user);
        $job->onConnection('redis');
        dispatch($job);

        //log the user in
        return [
            'code' => 0,
            'message' => 'User Successful Registered!',
            'username' => $user->username,
            'bal' => $user->credit->new_bal
        ];
    }

    public function add_transaction(Request $request)
    {
        $t = new Transaction();

        $input = $request->all();

        $t->add($input['msisdn'], $input['transaction_id'], $input['amount'], $input['user_id'], $input['pin']);

//        return response()->json(["msisdn" => $input['msisdn'],
//            "transaction_id" => $input['transaction_id'],
//            "amount" => $input['amount'],
//            "user_id" => $input['user_id'],
//            "pin" => $input['pin']
//        ]);
    }

    public function update_transaction($tran_id)
    {
        return response()->json(["trans_id" => $tran_id]);
    }

    public function test()
    {
        return "test";
    }


    public function make_payment(Request $request)
    {





//      if(strtolower($request->input('option'))  != 'sms'):

//        $mtn_url = "http://5.9.86.210/pay/mtn/messenger_socialmedia.php";
//        $tigo_url = "http://5.9.86.210/pay/tigo/messenger_socialmedia.php";
//        $airtel_url = "http://5.9.86.210/pay/airtel/messenger_socialmedia.php";
//        $vodafone_url = "http://5.9.61.79/pay/vodafone/messenger_socialmedia.php";

//        else:
//        $tigo_url = "http://5.9.86.210/pay/tigo/deywuro_live.php";
        $mtn_url = "http://5.9.86.210/pay/mtn/deywuro_live.php";
        $tigo_url = "http://5.9.86.210/pay/airtel/deywuro_live.php";
        $airtel_url = "http://5.9.86.210/pay/airtel/deywuro_live.php";
        $vodafone_url = "http://5.9.61.79/pay/vodafone/deywuro_live.php";


        $msisdn = $request['msisdn'];
        $amount = $request['amount'];
        $description = $request["description"];
        $user_id = $request['user_id'];
        $password = $request["password"];
        $username = $request["username"];
        $network =  $request["network"];
        $option  =  strtolower($request->input('option'));
        $option  =  str_replace(' ','_',$option);
        $voucher_number = $request['voucher_number'];


        if (empty($msisdn)) {
            return [
                'code' => 401,
                'message' => 'The phone number is required'
            ];
        }

        if (strlen($msisdn) != 12) {
            return [
                'code' => 401,
                'message' => 'The phone number is invalid'
            ];
        }

        if (empty($amount)) {
            return [
                'code' => 401,
                'message' => 'The amount required'
            ];
        }

        if ($amount < 0.5) {
            return [
                'code' => 401,
                'message' => 'The amount must be greater than 0.5'
            ];
        }

        if (empty($description)) {
            return [
                'code' => 401,
                'message' => 'The description is required'
            ];
        }

        if (empty($user_id)) {
            return [
                'code' => 401,
                'message' => 'The user_id is required'
            ];
        }

        if (empty($password)) {
            return [
                'code' => 401,
                'message' => 'The password is required'
            ];
        }

        if (empty($username)) {
            return [
                'code' => 401,
                'message' => 'The username is required'
            ];
        }

        if (empty($network)) {
            return [
                'code' => 401,
                'message' => 'The network is required'
            ];
        }

//        if ($network == "VODAFONE" && empty($voucher_number)) {
//            return [
//                'code' => 401,
//                'message' => 'The voucher_number is required'
//            ];
//        }

        if ($network == "MTN") {

            $request = array(
                'msisdn' => $msisdn,
                'amount' => $amount,
                'description' => $description,
                'user_id' => $user_id,
                'password' => $password,
                'username' => $username,
                'option' => $option
            );

            $ch = curl_init($mtn_url);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            $output = curl_exec($ch);

            if ($output == "00000-Done") {
                return [
                    'code' => 0,
                    'message' => 'Success'
                ];
            }

        }
        elseif ($network == "TIGO") {

            $request = array(
                'msisdn' => $msisdn,
                'amount' => $amount,
                'description' => $description,
                'user_id' => $user_id,
                'password' => $password,
                'username' => $username,
                'option' => $option
            );

            $ch = curl_init($tigo_url);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            $output = curl_exec($ch);

            if ($output == "00000-Done") {
                return [
                    'code' => 0,
                    'message' => 'Success'
                ];
            }

        }
        elseif ($network == "AIRTEL")
        {

            $request = array(
                'msisdn' => $msisdn,
                'amount' => $amount,
                'description' => $description,
                'user_id' => $user_id,
                'password' => $password,
                'username' => $username,
                'option' => $option
            );

            $ch = curl_init($airtel_url);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            $output = curl_exec($ch);

            if ($output == "00000-Done") {
                return [
                    'code' => 0,
                    'message' => 'Success'
                ];
            }

        }
        else {

            $request = array(
                'msisdn' => $msisdn,
                'amount' => $amount,
                'description' => $description,
                'user_id' => $user_id,
                'password' => $password,
                'username' => $username,
                'voucher_number' => $voucher_number,
                'option' => $option
            );

            $ch = curl_init($vodafone_url);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            $output = curl_exec($ch);

            if ($output == "00000-Done") {
                return [
                    'code' => 0,
                    'message' => 'Success'
                ];
            }
        }
    }

    public function get_groups(Request $request)
    {
        $data = DB::select(DB::raw("SELECT * FROM contact_groups  where user_id = '$request->id'"));

//        return (count($data));

        return ['code' => 0, 'count' => count($data), 'data' => $data];
    }

    public function get_contacts(Request $request)
    {
        $data = DB::select(DB::raw("SELECT * FROM contacts  where contact_group_id = '$request->id'"));

        return ['code' => 0, 'count' => count($data), 'data' => $data];
    }

    public function send_group_sms(Request $request)
    {
        $ids = $request->ids;
        $message = $request->message;
        $source = $request->source;
        $username = $request->username;
        $password = $request->password;

        $ids_trim = rtrim($ids, ",");

        if (!empty($ids_trim))
            $tpp = "contact_group_id IN ($ids_trim)";
        else
            $tpp = "contact_group_id < 0";

        $data = DB::select(DB::raw("SELECT * FROM hellio.contacts WHERE $tpp"));

        $count = count($data);

        if ($count > 0) {

            $numbers = '';

            $source = urlencode($source);
            $message = urlencode($message);

            for ($i = 0; $i < $count; $i++) {
                $numbers .= $data[$i]->phone_number . ",";
            }

            $numbers = rtrim($numbers, ",");

            $url = "https://deywuro.com/api/sms/?username=" . $username . "&password=" . $password . "&destination=" . $numbers . "&source=" . $source . "&message=" . $message;
            $curl = curl_init($url);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
            $var = curl_exec($curl);
            curl_close($curl);

            return ["code" => 0, "contacts" => $count];

        } else {
            return ["code" => 0, "contacts" => $count];
        }
    }




    public function whatsapp_api(Request $request)
    {
        dd($this->info_bib());
    }



    public function info_bib()
    {


        $username = "GCB_Bank!";
        $Password =  "Gmoney@2020";
//        $conc_cred = "$username:$Password";
//        $encoded_data =  base64_encode($conc_cred);
//        $Authorization_header = "Basic $encoded_data";

        $base_url = 'https://ej8p81.api.infobip.com';

        $sendWhatsApp = $base_url.'/omni/1/advanced';
//        $scenario  =  $base_url.'/omni/1/scenarios/5CC3C47EA6640C5401CD4DC9B304192B';
//        $scenario  =  $base_url.'/omni/1/scenarios/6F4193863DF9E74FCF43A4A05EFE7EC4';
//        $scenario  =  $base_url.'/omni/1/scenarios';


//        $request = array(
//            "name" => "NPONTU-API",
//            "flow" => [
//                [
//                    "from" => "233272226226",
//                    "channel"=> "WHATSAPP"
//                ],
//            ],
//            "default"=> true
//        );








        $request = array(
            'destinations' => [
                [
                    'to' => [
                        "phoneNumber"=>'233203450921',
                    ],
                ]
            ],
            'scenarioKey'=> '6F4193863DF9E74FCF43A05EFE7EC4',
            'whatsApp'=>[
                "templateName"> "query_bank_account_success",
                'templateData' => [
                    "Debora", "Npontu","12345"
                ],
                'language'=>'en'
            ]
        );

        $headers = array(
            'Content-Type: application/json',
            "Authorization: Basic R0NCX0JhbmshOkdtb25leUAyMDIw"
        );
        $ch = curl_init($sendWhatsApp);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($request));
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $output = curl_exec($ch);
        dd($output);
    }
}


















