<?php

namespace App\Http\Controllers;

use App\Models\Meme;
use App\Models\User;
use App\Models\Address;
use Illuminate\Http\Request;
use chillerlan\QRCode\{QRCode, QROptions};
use MoneroIntegrations\MoneroPhp\walletRPC;
use Artesaos\SEOTools\Facades\SEOTools;

class MemeController extends Controller
{

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        // $this->middleware('auth');
    }

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        SEOTools::setTitle('Home');
        $data = [
            'memes' => Meme::with(['user', 'tips'])->orderByDesc('created_at')->paginate(20),
        ];
        return view('homepage', ['data' => $data]);
    }

    public function leaderboard()
    {
        SEOTools::setTitle('Leaderboard');
        $users = User::with('tips')->has('memes')->get();
        $users = $users->sortByDesc(function($user) {
            return $user->tips_total;
        });

        $data = [
            'users' => $users,
        ];

        return view('leaderboard', ['data' => $data]);
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        SEOTools::setTitle('Submit');
        return view('meme-create');
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $validatedData = $request->validate([
            'title' => ['required', 'string', 'max:255'],
            'caption' => ['string', 'max:255', 'nullable'],
            'image' => ['required', 'image'],
        ]);
        $user = \Auth::user();
        Meme::create([
            'user_id' => $user->id,
            'title' => $request->input('title'),
            'caption' => $request->input('caption'),
            'image' => $request->file('image'),
        ]);
        return redirect('dashboard')->with('submitted', 'Meme submitted succesfully! Will be approved soon.');
    }

    /**
     * Display the specified resource.
     *
     * @param  \App\Models\Meme  $meme
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        $meme = Meme::where('id', $id)->with(['user', 'tips'])->firstOrFail();

        SEOTools::setTitle($meme->title);
        SEOTools::addImages($meme->image_url);

        $share = \Share::page(url()->current(), $meme->title, ['class' => 'fa-lg', 'target' => '_blank'])
        	->facebook()
        	->twitter()
        	->reddit()
        	->telegram()
        	->linkedin()
        	->whatsapp();

        $data = [
            'meme' => $meme,
            'qr' => (new QRCode)->render($meme->address),
            'share' => preg_replace("/<a(.*?)>/", "<a$1 target=\"_blank\">", $share),
        ];

        return view('meme', ['data' => $data]);
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  \App\Models\Meme  $meme
     * @return \Illuminate\Http\Response
     */
    public function edit(Meme $meme)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\Models\Meme  $meme
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, Meme $meme)
    {
        //
    }

    public function approve($id)
    {
        if (\Auth::user()->is_admin === 1) {
            try {
                $walletRPC = new walletRPC(config('app.xmr_daemon_ip'), config('app.xmr_network_port')); // Change to match your wallet (monero-wallet-rpc) IP address and port; 18083 is the customary port for mainnet, 28083 for testnet, 38083 for stagenet
                $open_wallet = $walletRPC->open_wallet(config('app.xmr_wallet_name'), '');
                $account = $walletRPC->create_account();
                $meme = Meme::withoutGlobalScope('approved')->find($id);
                $meme->is_approved = 1;
                $meme->account_index = $account['account_index'];
                $meme->address = $account['address'];
                $meme->save();
                return redirect()->away(url()->previous());
            } catch (\Exception $e) {

            }
        }
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\Models\Meme  $meme
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        if (\Auth::user()->is_admin === 1) {
            Meme::withoutGlobalScope('approved')->where('id', $id)->delete();
            return redirect()->away(url()->previous());
        }
    }
}
