<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Cache;
use DB;
use League\CommonMark\CommonMarkConverter;
use App\Services\AccountService;
use App\Services\StatusService;
use App\Services\SnowflakeService;
use App\Util\Localization\Localization;

class SpaController extends Controller
{
    public function index(Request $req)
    {
    	abort_unless(config('exp.spa'), 404);
    	if(!$req->user()) { return redirect('/login'); }
    	return view('layouts.spa');
    }

	public function webPost(Request $request, $id)
	{
    	abort_unless(config('exp.spa'), 404);
		if($request->user()) {
			return view('layouts.spa');
		}

		$post = StatusService::get($id, false);

		if($post && !in_array($post['visibility'], ['public', 'unlisted'])) {
			return redirect('/login');
		}

		if(
			$post &&
			isset($post['url']) &&
			isset($post['local']) &&
			$post['local'] === true
		) {
			return redirect($post['url']);
		}

    	return redirect('/login');
	}

	public function webProfile(Request $request, $id)
	{
    	abort_unless(config('exp.spa'), 404);
		if($request->user()) {
			if(substr($id, 0, 1) == '@') {
				$id = AccountService::usernameToId(substr($id, 1));
				return redirect("/i/web/profile/{$id}");
			}
			return view('layouts.spa');
		}

		$account = AccountService::get($id);

		if($account && isset($account['url']) && $account['local']) {
			return redirect($account['url']);
		}

		return redirect('/login');
	}

	public function updateLanguage(Request $request)
	{
		abort_unless(config('exp.spa'), 404);
		abort_unless($request->user(), 404);
		$this->validate($request, [
			'v' => 'required|in:0.1,0.2',
			'l' => 'required|alpha_dash|max:5'
		]);

		$lang = $request->input('l');
		$user = $request->user();

		abort_if(!in_array($lang, Localization::languages()), 400);

		$user->language = $lang;
		$user->save();
		session()->put('locale', $lang);

		return ['language' => $lang];
	}

	public function getPrivacy(Request $request)
	{
		abort_unless($request->user(), 404);
		$body = $this->markdownToHtml('views/page/privacy.md');
		return [
			'body' => $body
		];
	}

	public function getTerms(Request $request)
	{
		abort_unless($request->user(), 404);
		$body = $this->markdownToHtml('views/page/terms.md');
		return [
			'body' => $body
		];
	}

	protected function markdownToHtml($src, $ttl = 600)
	{
		return Cache::remember(
			'pf:doc_cache:markdown:' . $src,
			$ttl,
			function() use($src) {
				$path = resource_path($src);
				$file = file_get_contents($path);
				$converter = new CommonMarkConverter();
				return (string) $converter->convertToHtml($file);
		});
	}

	public function usernameRedirect(Request $request, $username)
	{
		abort_unless($request->user(), 404);
		$id = AccountService::usernameToId($username);
		if(!$id) {
			return redirect('/i/web/404');
		}
		return redirect('/i/web/profile/' . $id);
	}

	public function hashtagRedirect(Request $request, $tag)
	{
		if(!$request->user()) {
			return redirect('/discover/tags/' . $tag);
		}

		return view('layouts.spa');
	}
}