<?php

namespace App\Http\Controllers\Admin;

use App\Exports\StaticTranslationsExport;
use App\Http\Controllers\Controller;
use App\Http\Requests\AdminLanguageRequest;
use App\Http\Requests\AdminTranslationRequest;
use App\Imports\StaticTranslationsImport;
use App\Libs\Facades\Localization;
use App\Libs\Facades\RequestContext;
use App\Libs\Services\LanguageService;
use Carbon\Carbon;
use Exception;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Language;
use Maatwebsite\Excel\Facades\Excel;

class LanguageController extends Controller
{
    public function getLanguagesManager(LanguageService $service)
    {
        $website = Localization::getWebsite();
        return view('admin/pages/languages-manager')
            ->with(array(
                'website' => $website
            ));
    }

    public function getEdit($languageId = null)
    {
        $website = Localization::getWebsite();
        $user = Auth::guard('admin')->user();

        if(!$user->hasRole(array("Administrator"))){
            abort(403);
        }

        RequestContext::set('selected_menu', 'admin');

        if (!empty($languageId)) {
            $language = $website->languages()->find($languageId);
        } else {
            $language = new Language();
        }

        $nextPosition = $website->languages()->get()->max('pivot.position') + 1;

        return view('admin/pages/edit-language')
            ->with(array(
                'language' => $language,
                'nextPosition' => $nextPosition,
                'languages' => Localization::getSupportedLanguages(),
                'defaultLanguageId' => Localization::getDefaultLocale(),
                'isNew' => $languageId == null
            ));
    }

    public function postEdit($languageId = null, AdminLanguageRequest $request, LanguageService $service)
    {
        $website = Localization::getWebsite();
        $user = Auth::guard('admin')->user();

        if(!$user->hasRole(array("Administrator"))){
            abort(403);
        }

        $language = $service->createOrUpdate($request->input(), $website, $languageId);

        if ($language->will_clone) {
            $successMessage = "Language saved with success. The translated content will be generated in the following 15 to 30 minutes.";
        } else {
            $successMessage = trans('backend.save_success');
        }

        return redirect()->to('/admin/languages-manager/edit/'.$language->id)->with("message", $successMessage);
    }

    public function postDelete($languageId, LanguageService $service)
    {
        $website = Localization::getWebsite();
        $user = Auth::guard('admin')->user();

        if(!$user->hasRole(array("Administrator"))){
            abort(403);
        }

        $service->delete($languageId, $website);

        return redirect()->to('/admin/languages-manager');
    }

    public function getEditTranslations(string $languageId)
    {
        $website = Localization::getWebsite();
        $user = Auth::guard('admin')->user();

        if(!$user->hasRole(array("Administrator"))){
            abort(403);
        }

        RequestContext::set('selected_menu', 'admin');
        $language = $website->languages()->find($languageId);

        if (!$language) {
            abort(404);
        }

        $defaultTranslations = trans('frontend');

        app()->setLocale($language->id);

        $translations = trans('frontend');

        return view('admin/pages/static-translations')
            ->with(array(
                'language' => $language,
                'defaultTranslations' => $defaultTranslations,
                'translations' => $translations
            ));
    }

    public function postSaveTranslation(AdminTranslationRequest $request, LanguageService $service)
    {
        $user = Auth::guard('admin')->user();

        if(!$user->hasRole(array("Administrator"))){
            abort(403);
        }

        $data = $request->input();

        $line = $service->saveStaticTranslation($data['id'], $data['language'], $data['translation']);

        return response()->json(array(
            "translation" => !empty($line->text[$data['language']]) ? $line->text[$data['language']] : ""
        ), 200);
    }

    public function getExportStaticTranslationsCsv($languageId)
    {
        return Excel::download(new StaticTranslationsExport($languageId), 'static-translations-' . $languageId . '.xlsx');
    }

    public function postImportStaticTranslationsCsv($languageId, Request $request, LanguageService $service)
    {
        try {
            $data = Excel::toArray(new StaticTranslationsImport, $request->file)[0];
            $translations = [];
            foreach ($data as $line) {
                $translations[$line['key']] = $line['translation'];
            }
            $service->importTranslations($languageId, $translations);
        } catch(Exception $e) {
            abort(400);
        }
        return response()->json(['success' => true]);
    }
}
