<?php

namespace App\Http\Controllers\Reseller;

use App\AuditTrail;
use App\DataTables\ResellerClientHistDataTable;
use App\DataTables\ResellerClientInvoiceDataTable;
use App\DataTables\ResellerCreditHistoryDataTable;
use App\Http\Controllers\Controller;
use App\Role;
use App\Setting;
use App\SocialMediaCredit;
use App\SocialPaymentHistory;
use App\Tools\SmsTools;
use App\User;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Input;
use Illuminate\Support\Facades\Response;
use Intervention\Image\Facades\Image;
use PDF;

class DashboardController extends Controller
{

    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 index() {

        $_enb = false;
        $role = auth()->user()->role->name;

        $_usr = \auth()->user();

        //return $_usr->created_by;

        if($_usr->created_by == "messenger"){
            $_enb = true;
        }


        $role = auth()->user()->role->name;
        if(strtolower($role) !== 'reseller')
            if(strtolower($role) == 'admin')
                return redirect()->route('admin.main_route');
            else
                return redirect()->route('main_route');

        return view('reseller.welcome',[
            'enable_pay'=>$_enb
        ]);
    }

    public function financial_index() {
        return view('reseller.financial_dashboard');
    }

    public function get_user_log_summary(Request $request) {
        $type = $request['type'];

        $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));

        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=='')
        {
            //$date = $this->get_date_by_day_name($type);
            $from_date  = Carbon::today();
            $to_date    = Carbon::today()->addDay()->subSecond();
            $dash_title = ucfirst($type).'Today\'s Dashboard';
        }


        $data = DB::table('sms_log as l')
            ->leftJoin('users as u', 'u.id', '=', 'l.user_id')
            ->select(DB::raw("l.status, count(*) as total"))
            ->where('u.created_by', '=', $user->username)
            ->whereBetween('l.submit_date', [$from_date->toDateTimeString(), $to_date->toDateTimeString()])
            ->groupBy('l.status')->get();

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

        $total_sms_sent = DB::table('sms_log as l')
            ->leftJoin('users', 'users.id', '=', 'l.user_id')
            ->where('users.created_by', Auth::user()->username)
            ->whereBetween('l.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 [
            'dash_title' => $dash_title,
            'total_sms_sent' => (int)$total_sms_sent,
            'total_sms_delivered' => (int)$total_sms_delivered,
            'total_sms_ack' => (int)$total_sms_ack,
            'total_sms_undelivered' => (int)$total_sms_undelivered,
            'total_sms_expired' => (int)$total_sms_expired,
            'total_balance' => SmsTools::round_currency($user->credit->new_bal)
        ];
    }


    public function get_financial_summary(Request $request) {
        $user = Auth::user();
        $type = $request['type'];
        $clientId = Role::whereName('user')->firstOrFail()->id;
        $activeClientThreshold = 800;

        $date = Carbon::now();
        $from_date = Carbon::parse($date->toDateString());
        $to_date = clone $from_date;
        $to_date = Carbon::parse($to_date->addDays(1)->addSeconds(-1));

        //compute operational expenses
        $setting = Setting::whereUserId(auth()->id())->first();
        $setting = !empty($setting) ? $setting : new Setting();
        $electricity = empty($setting->electricity) ? 0 : $setting->electricity;
        $water = empty($setting->water) ? 0 : $setting->water;
        $others = empty($setting->others) ? 0 : $setting->others;

        $total_expense = $electricity + $water + $others;

        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';
            $total_expense /= 4.0;
        } 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';
            $total_expense /= 30.0;
        }

        //compte new clients
        $thisMonth = new Carbon('first day of this month');
        $thisMonth->setTime(0, 0, 0);

        $newClientsCount = User::whereCreatedBy($user->username)->where('created_at', '>=', $thisMonth->toDateTimeString())->count();

        //compute active clients
        $activeClients = DB::select("select count(*) as tot from
(select count(*) as total, user_id from sms_log join users on users.id=sms_log.user_id where users.created_by=? group by user_id) T
where total >= 800", [$user->username]);

        //operational expense continued
        $results = DB::select("
SELECT LEFT(s.msisdn, 5) as prefix, SUM(s.sms_count) as total 
FROM sms_log s join users u ON u.id = s.user_id 
WHERE u.created_by=? and s.submit_date BETWEEN ? AND ?
GROUP BY prefix
", [$user->username, $from_date->toDateTimeString(), $to_date->toDateTimeString()]);

        $sms_price = 0.0;
        foreach ($results as $result) {
            $results2 = DB::select("
    SELECT nt.sms_price as sms_price
    FROM networks nt LEFT JOIN user_networks un ON nt.id=un.network_id
    WHERE nt.prefix like ? and un.user_id=? LIMIT 0,1
", ['%'.$result->prefix.'%', $user->id]);
            if(!empty($results2) && isset($results2[0]) && !empty($results2[0])) {
                $sms_price += ($results2[0]->sms_price * $result->total);
            } else {
                $results2 = DB::select("SELECT nt.sms_price FROM networks nt WHERE nt.prefix like '%23324%' LIMIT 0,1");
                if(!empty($results2) && isset($results2[0]) && !empty($results2[0])) {
                    $sms_price += ($results2[0]->sms_price * $result->total);
                } else {
                    $sms_price += (0.03 * $result->total);
                }
            }
        }
        $total_expense += $sms_price;

        //compute revenue
        $results = DB::select("
SELECT LEFT(s.msisdn, 5) as prefix, s.user_id, SUM(s.sms_count) as total 
FROM sms_log s join users u ON u.id = s.user_id 
WHERE u.created_by=? and s.submit_date BETWEEN ? AND ?
GROUP BY prefix, user_id
", [$user->username, $from_date->toDateTimeString(), $to_date->toDateTimeString()]);

        $total_revenue = 0.0;
        foreach ($results as $result) {
            $results2 = DB::select("
    SELECT nt.sms_price as sms_price
    FROM networks nt LEFT JOIN user_networks un ON nt.id=un.network_id
    WHERE nt.prefix like ? and un.user_id=? LIMIT 0,1
", ['%'.$result->prefix.'%', $result->user_id]);
            if(!empty($results2) && isset($results2[0]) && !empty($results2[0])) {
                $total_revenue += ($results2[0]->sms_price * $result->total);;
            } else {
                $results2 = DB::select("SELECT nt.sms_price FROM networks nt WHERE nt.prefix like '%23324%' LIMIT 0,1");
                if(!empty($results2) && isset($results2[0]) && !empty($results2[0])) {
                    $total_revenue += ($results2[0]->sms_price * $result->total);
                } else {
                    $total_revenue += (0.03 * $result->total);;
                }
            }
        }
        $total_revenue *= 1.175;

        //compute profitability
        $profitability = $total_revenue - $total_expense;

        return [
            'dash_title' => $dash_title,
            'clients' => (int)User::whereCreatedBy($user->username)->count(),
            'active_clients' => (int)$activeClients[0]->tot,
            'new_clients' => $newClientsCount,
            'revenue' => round($total_revenue, 2),
            'profitability' => round($profitability, 2),
            'expenses' => round($total_expense, 2)
        ];
    }

    public function get_traffic_performance_data(Request $request) {
        $returnvalue = [];
        $returnvalue[] = ['Count', 'Delivered', 'Undelivered','Acknowledged','Expired'];
        $type = $request['type'];
        $user = Auth::user();

        if($type!='month') {
            //process for day of week
            $data = DB::select("select 
 LEFT(submit_date,10) AS sentAt,
 sms_log.`status` as stat, 
 count(sms_log.username) as t 
from sms_log left join users ON users.id=sms_log.user_id
where (sms_log.user_id=? or users.created_by=?)
and (submit_date between DATE_SUB(CURDATE(),INTERVAL 7 DAY)  and DATE_ADD(CURDATE(), INTERVAL 1 DAY))
GROUP BY sentAt,stat", [$user->id,$user->username]);

            $main = [];
            $cdate = '';
            $tempArray = [];
            foreach ($data as $dat) {
                $status = $dat->stat;
                $total = $dat->t;
                $tempArray["{$status}"] = $total;
                if($cdate != $dat->sentAt) {
                    if(!empty($cdate)) {
                        $main["$cdate"] = $tempArray;
                        $tempArray = [];
                    }
                    $cdate = $dat->sentAt;
                }
            }
            $main["$cdate"] = $tempArray;

            foreach ($main as $key => $tempArray) {
                $returnvalue[] = [
                    $this->get_day_name(Carbon::parse($key)),
                    isset($tempArray['DELIVRD']) ? (int)$tempArray['DELIVRD'] : 0,
                    isset($tempArray['UNDELIV']) ? (int)$tempArray['UNDELIV'] : 0,
                    isset($tempArray['ACK']) ? (int)$tempArray['ACK'] : 0,
                    isset($tempArray['EXPIRED']) ? (int)$tempArray['EXPIRED'] : 0
                ];
            }
        } else {
            //process for month
            $now = Carbon::now();
            for($i=1; $i<=5; $i++) {
                $to_date = SmsTools::get_end_of_week($now->year, $now->month, $i);
                $from_date = SmsTools::get_start_of_week($to_date);

                $data = DB::select('select sms_log.`status`, count(*) as total from `sms_log` join users ON users.id=sms_log.user_id where (sms_log.`user_id`=? or users.created_by=?) AND `submit_date` between ? and ? GROUP BY sms_log.`status`', [
                    Auth::user()->id,
                    Auth::user()->username,
                    $from_date->toDateTimeString(),
                    $to_date->toDateTimeString()
                ]);
                $tempArray = [];
                foreach ($data as $dat) {
                    $status = $dat->status;
                    $total = $dat->total;
                    $tempArray["{$status}"] = $total;
                }
                $returnvalue[] = [
                    'Week '.$i,
                    isset($tempArray['DELIVRD']) ? (int)$tempArray['DELIVRD'] : 0,
                    isset($tempArray['UNDELIV']) ? (int)$tempArray['UNDELIV'] : 0,
                    isset($tempArray['ACK/']) ? (int)$tempArray['ACK/'] : 0,
                    isset($tempArray['EXPIRED']) ? (int)$tempArray['EXPIRED'] : 0
                ];
            }
        }

        return $returnvalue;
    }

    public function get_financial_data(Request $request) {
        $returnvalue = [];
        $returnvalue[] = ['Count', 'Revenue','Cost of goods','Profit'];
        $type = $request['type'];
        $user = Auth::user();

        //compute operational expenses
        $setting = Setting::whereUserId(auth()->id())->first();
        $setting = !empty($setting) ? $setting : new Setting();
        $electricity = empty($setting->electricity) ? 0 : $setting->electricity;
        $water = empty($setting->water) ? 0 : $setting->water;
        $others = empty($setting->others) ? 0 : $setting->others;

        $total_expense = $electricity + $water + $others;
        $data = [];

        if($type!='month') {
            $total_expense /= 30.0;

            //operational expense continued
            $results = DB::select("
SELECT LEFT(s.msisdn, 5) as prefix, LEFT(submit_date,10) AS sentAt, SUM(s.sms_count) as total 
FROM sms_log s join users u ON u.id = s.user_id 
WHERE u.created_by=?
and (submit_date between DATE_SUB(CURDATE(),INTERVAL 7 DAY)  and DATE_ADD(CURDATE(), INTERVAL 1 DAY))
GROUP BY prefix, sentAt
ORDER BY sentAt 
", [$user->username]);

            foreach ($results as $result) {
                if(!isset($data["{$result->sentAt}"]))
                    $data["{$result->sentAt}"] = ['cost'=>0, 'revenue'=>0, 'profit'=>0];

                $results2 = DB::select("
    SELECT nt.sms_price as sms_price
    FROM networks nt LEFT JOIN user_networks un ON nt.id=un.network_id
    WHERE nt.prefix like ? and un.user_id=? LIMIT 0,1
", ['%'.$result->prefix.'%', $user->id]);
                if(!empty($results2) && isset($results2[0]) && !empty($results2[0])) {
                    $sms_price = ($results2[0]->sms_price * $result->total);
                } else {
                    $results2 = DB::select("SELECT nt.sms_price FROM networks nt WHERE nt.prefix like '%23324%' LIMIT 0,1");
                    if(!empty($results2) && isset($results2[0]) && !empty($results2[0])) {
                        $sms_price = ($results2[0]->sms_price * $result->total);
                    } else {
                        $sms_price = (0.03 * $result->total);
                    }
                }
                $data["{$result->sentAt}"]['cost'] += ($sms_price + $total_expense);
            }


            //compute revenue
            $results = DB::select("
SELECT LEFT(s.msisdn, 5) as prefix, LEFT(submit_date,10) AS sentAt, s.user_id, SUM(s.sms_count) as total 
FROM sms_log s join users u ON u.id = s.user_id 
WHERE u.created_by=? 
and (submit_date between DATE_SUB(CURDATE(),INTERVAL 7 DAY)  and DATE_ADD(CURDATE(), INTERVAL 1 DAY))
GROUP BY prefix, sentAt, user_id
ORDER BY sentAt
", [$user->username]);

            foreach ($results as $result) {

                $results2 = DB::select("
    SELECT nt.sms_price as sms_price
    FROM networks nt LEFT JOIN user_networks un ON nt.id=un.network_id
    WHERE nt.prefix like ? and un.user_id=? LIMIT 0,1
", ['%'.$result->prefix.'%', $result->user_id]);
                if(!empty($results2) && isset($results2[0]) && !empty($results2[0])) {
                    $total_revenue = ($results2[0]->sms_price * $result->total);;
                } else {
                    $results2 = DB::select("SELECT nt.sms_price FROM networks nt WHERE nt.prefix like '%23324%' LIMIT 0,1");
                    if(!empty($results2) && isset($results2[0]) && !empty($results2[0])) {
                        $total_revenue = ($results2[0]->sms_price * $result->total);
                    } else {
                        $total_revenue = (0.03 * $result->total);;
                    }
                }
                $data["{$result->sentAt}"]['revenue'] += $total_revenue;
            }

            //compute profitability
            foreach ($data as &$datum) {
                $datum['revenue'] *= 1.175;
                $datum['profit'] = $datum['revenue'] - $datum['cost'];
            }

            foreach ($data as $key => $tempArray) {
                $returnvalue[] = [
                    $this->get_day_name(Carbon::parse($key)),
                    isset($tempArray['revenue']) ? (int)$tempArray['revenue'] : 0,
                    isset($tempArray['cost']) ? (int)$tempArray['cost'] : 0,
                    isset($tempArray['profit']) ? (int)$tempArray['profit'] : 0,
                ];
            }
        } else {
            $request['type'] = '';
            return $this->get_financial_data($request);
        }

        return $returnvalue;
    }

    public function download_receipt($client_id, $id) {
        $record = User::where([
            ['created_by', '=', Auth::user()->username]
        ])->findOrFail($client_id)->creditHistory()->findOrFail($id);
//        return view('print.payment_receipt', ['record' => $record]);
        $pdf = PDF::loadView('print.payment_receipt', ['record' => $record]);
        return $pdf->download('receipt.pdf');
    }

    public function get_credit_history(ResellerCreditHistoryDataTable $dataTable, $client_id) {
        $user = User::where([
            ['created_by', '=', Auth::user()->username]
        ])->findOrFail($client_id);
        return $dataTable->with_client_id($client_id)->render('reseller.account.credit_history', ['user'=>$user]);
    }

    public function view_clients_for_credit_history(ResellerClientHistDataTable $dataTable)
    {
        return $dataTable->render('reseller.reports.clients_cred_hist');
    }

    public function view_clients_for_invoice(ResellerClientInvoiceDataTable $dataTable)
    {
        return $dataTable->render('reseller.reports.clients_invoice');
    }

    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->addDay()->copy();
        }
    }

    private function get_day_name(Carbon $date) {
        if($date->isMonday()) {
            return "Mon";
        }
        if($date->isTuesday()) {
            return "Tue";
        }
        if($date->isWednesday()) {
            return "Wed";
        }
        if($date->isThursday()) {
            return "Thu";
        }
        if($date->isFriday()) {
            return "Fri";
        }
        if($date->isSaturday()) {
            return "Sat";
        }
        if($date->isSunday()) {
            return "Sun";
        }
        return "Unknown";
    }

    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;
        }
    }

    public function get_user_picture($id) {
        $record = User::findOrFail($id);
        if(empty($record->picture)) {
            //Image file is stored under project/public/global/portrait/5.jpg
            $file= public_path('global/portraits/17.jpg');

            $headers = array(
                'Content-Type: image/jpeg',
            );

            return Response::download($file, '17.jpg', $headers);
        }
        $pic = Image::make($record->picture->picture);
        $response = Response::make($pic->encode('jpeg'));
        $response->header('Content-Type', 'image/jpeg');
        return $response;
    }



    public function get_user_profile() {
        return view('reseller.profile', ['user'=>Auth::user()]);
    }

    public function get_reseller_data_user(Request $request) {
        $returnvalue = [];
        $returnvalue[] = ['Count', 'Delivered', 'Undelivered','Acknowledged','Expired'];
        $username = $request->input('username');

        //process for day of week
        $now = Carbon::now()->setTime(0, 0, 0);
        $one_week_ago = Carbon::now()->addWeeks(-1)->setTime(0, 0, 0);
        while ($one_week_ago->lte($now)) {
            $one_week_ago = $one_week_ago->addDay();
            $from_date = Carbon::parse($one_week_ago->toDateString());
            $to_date = clone $from_date;
            $to_date = Carbon::parse($to_date->addDays(1)->addSeconds(-1));

            $data = DB::select('select `status`, count(*) as total from `sms_log` sl LEFT JOIN `users` u ON u.id=sl.user_id where `u`.created_by=? AND `u`.username=? AND sl.`submit_date` between ? and ? GROUP BY `status`', [
                Auth::user()->username,
                $username,
                $from_date->toDateTimeString(),
                $to_date->toDateTimeString()
            ]);
            $tempArray = [];
            foreach ($data as $dat) {
                $status = $dat->status;
                $total = $dat->total;
                $tempArray["{$status}"] = $total;
            }
            $returnvalue[] = [
                $this->get_day_name($one_week_ago),
                isset($tempArray['DELIVRD']) ? $tempArray['DELIVRD'] : 0,
                isset($tempArray['UNDELIV']) ? $tempArray['UNDELIV'] : 0,
                isset($tempArray['ACK/']) ? $tempArray['ACK/'] : 0,
                isset($tempArray['EXPIRED']) ? $tempArray['EXPIRED'] : 0
            ];
        }

        return $returnvalue;
    }

    public function get_reseller_data(Request $request) {
        $returnvalue = [];
        $returnvalue[] = ['Count', 'Delivered', 'Undelivered','Acknowledged','Expired'];

        //process for day of week
        $now = Carbon::now()->setTime(0, 0, 0);
        $one_week_ago = Carbon::now()->addWeeks(-1)->setTime(0, 0, 0);
        while ($one_week_ago->lte($now)) {
            $one_week_ago = $one_week_ago->addDay();
            $from_date = Carbon::parse($one_week_ago->toDateString());
            $to_date = clone $from_date;
            $to_date = Carbon::parse($to_date->addDays(1)->addSeconds(-1));

            $data = DB::select('select sl.status, count(*) as total from `sms_log` sl LEFT JOIN `users` u ON u.id=sl.user_id where `u`.created_by=? AND sl.`submit_date` between ? and ? GROUP BY sl.`status`', [
                Auth::user()->username,
                $from_date->toDateTimeString(),
                $to_date->toDateTimeString()
            ]);
            $tempArray = [];
            foreach ($data as $dat) {
                $status = $dat->status;
                $total = $dat->total;
                $tempArray["{$status}"] = $total;
            }
            $returnvalue[] = [
                $this->get_day_name($one_week_ago),
                isset($tempArray['DELIVRD']) ? $tempArray['DELIVRD'] : 0,
                isset($tempArray['UNDELIV']) ? $tempArray['UNDELIV'] : 0,
                isset($tempArray['ACK/']) ? $tempArray['ACK/'] : 0,
                isset($tempArray['EXPIRED']) ? $tempArray['EXPIRED'] : 0
            ];
        }

        return $returnvalue;
    }

    public function get_reseller_users(Request $request)
    {
        $user = $request->get('user');
        $senders = null;

        if ($user != null)
        {
            $senders = DB::select("select distinct(sender) from sms_log where user_id = $user");

            return $senders;
        }

        return response($senders)->header('Content-Type', 'text/json');;
    }

    public function post_user_profile(Request $request) {
        if($request->has('btnPassword')) {
            //update password
            $this->validate($request, [
                'current_password' => 'required',
                'new_password' => 'required|min:6',
                'confirm_password' => 'same:new_password'
            ]);

            //TODO: check current password
            if (Hash::check($request['current_password'], $request->user()->getAuthPassword())) {
                $user = $request->user();
                $user->password = bcrypt($request['new_password']);
                $user->pass = $request['new_password'];
                $user->must_change_password = false;
                $user->save();

                $request->session()->flash('success', 'Your password has been successfully updated!');
            } else {
                return redirect()->back()->withInput()->withErrors(array('error' => 'Your current password is invalid'));
            }
        } else {
            //update user detail
            $this->validate($request, [
                'first_name' => 'required',
                'last_name' => 'required',
                'organisation' => 'present',
                'picture' => 'file',
                'phone_number' => 'required',
                'website_url' => 'present'
            ]);

            $inputs = $request->except(['picture']);
            $inputs['full_name'] = $inputs['last_name'].' '.$inputs['first_name'];
            $request->user()->update($inputs);

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

            }

            $request->session()->flash('success', 'Your details have been successfully updated!');
        }
        return redirect()->back();
    }

    public function goto_main_route() {
        return redirect()->route('reseller.app');
    }

    public function logout() {
        $user = Auth::user();

        AuditTrail::create([
            'user_id' => $user->id,
            'username' => $user->username,
            'date' => \Carbon\Carbon::now()->toDateTimeString(),
            'activity' => $user->name.' logged out '
        ]);

        Auth::logout();
        return redirect()->route('reseller.login', ['name'=>$user->username]);
    }


    public function newPurchaseReseller() {

        $_enb = false;
        $_usr = \auth()->user();



        return view('reseller/newPurchase', [
            'user' => $_usr,

        ]);

    }


    public function buy_now_reseller(Request $request){

        if($request->method() == 'POST'){

            $reqamount = $this->price($request);
            $length = 5;
            $ss = substr(str_shuffle(str_repeat($x = 'ABCDEFGHabcdefghijklmnopIJKLMNOPQRSTUVWXYZ123456789', ceil($length / strlen($x)))), 1, $length);
            $tran_id = $request->hashed_id . '' . $ss;
            $vendor = $request->network;
            $mm_endpoint = $request->phone;
            $amount = $reqamount;


            try {

                SocialMediaCredit::query()->create([
                    'trans_id' => $tran_id,
                    'user_id'    => Auth::user()->id,
                    'amount'    => $reqamount,
                ]);

                SocialPaymentHistory::query()->create([
                    'user_id' => Auth::user()->id,
                    'amount'    => $reqamount,
                    'mm_number' => $request->phone,
                    'p_status' => 'pending',
                    'res_mes' => 'pending',
                    'trans_id'=> $tran_id
                ]);

            }
            catch (\Exception $e){
                return redirect()->back()->withErrors('Payment Could not be process');
            }


//                    Continue to Execute API

            $paymentEndpoint = "http://pay.npontu.com/api/pay";
            $callbackResponseUrl = "http://mtnmessenger.com/api/payment";
            $request = array(
                'number' => $mm_endpoint,
                'vendor' => $vendor,
                'uid' => 'mtnmessenger',
                'pass' => 'mtnmessenger',
                'tp' => $tran_id,
                'cbk' => $callbackResponseUrl,
                'amt' => $amount,
                'msg' => 'MTN MSG',
                'vou' => '',
                'trans_type' => 'Debit'
            );
            $ch = curl_init($paymentEndpoint);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            $output = curl_exec($ch);
            $decode = json_decode($output);

                    return redirect()->route('reseller.app')->with('success','Successful');
        }

    }

    private function price($request){

        return 1;
    }
}

