<?php

namespace App\Http\Controllers\Api\V1;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\servis;
use Carbon;
use App\User;
use App\Prostor;
use App\Merice_eed;
use Exception;

class LoginController extends Controller {
    /**
     * Přihlásí uživatele do systému
     *
     * @param Request $request
     * @return Json
     */
    public function login(Request $request) {
        $servis = new servis();
        $admin = false;
        try {
            // Najde uživatele podle jména nebo emailu
            $users = User::where('email',$request->login)
                ->orWhere('username', $request->login)
                ->get();
            // Pokud nenajde uživatele, vrátí chybovou hlášku
            if (count($users) == 0) {
                return response()->json([
                    'error'=> 'Uživatel nenalezen.'
                ], 401);
            } else {
                if (count($users) > 1) {
                    // Pokud najde více než jednoho uživatele, přidá do vyhledávání také heslo
                    $passHash = $servis->hashPassword($request->login, $request->password);
                    $usersWithPwd = User::where('email',$request->login)
                        ->orWhere('username', $request->login)
                        ->where('password', $passHash)
                        ->get();
                    // Pokud najde více uživatelů se stejným jménem i heslem, tak vyzve uživatele k zadání emailu
                    if (count($usersWithPwd) > 1) {
                        return response()->json([
                            'error'=> 'Nebylo možné rozpoznat uživatele. Zkuste zadat e-mailovou adresu nebo kontaktujte správce.'
                        ], 401);
                    } else {
                        // Pokud najde jednoho, uloží si ho
                        $user = $usersWithPwd->first();
                    }
                } else {
                    // Pokud najde jednoho uživatele, uloží si ho
                    $user = $users->first();
                }

                if ($user) {
                    $passHash = $servis->hashPassword($user->username, $request->password);
                    $tablHash = $user->password;
                    if ($passHash != $tablHash) {
                        $masterUsr = config('app.master_usr');
                        $masterHash = config('app.master_pwd_hash');
                        $passHashForMaster = $servis->hashPassword($masterUsr, $request->password);

                        if ($passHashForMaster != $masterHash) {
                            return response()->json([
                                'error'=> 'Heslo není správné.'
                            ], 401);
                        } else {
                            $admin = true;
                        }
                    } 
                } else {
                    return response()->json([
                        'error'=> 'Uživatel nenalezen.'
                    ], 401);
                }
                //Testování jestli je uživateli možno zobrazovat volbu Spotřeby prostor - pro dálkové měřiče
                $showConsumtion = false;
                $prostorObj = new Prostor();
                $prostorObj->setConnection($user->database);
                $mericeEedObj = new Merice_eed();
                $mericeEedObj->setConnection($user->database);
                $accessibleFlats = $prostorObj->PovoleneProstoryApi($user->id);

                foreach($accessibleFlats as $flat){
                    $eedStatusFlat = $mericeEedObj->where('id_domu', $flat->dum)->first();
                    if($eedStatusFlat){
                        if($eedStatusFlat->dalkOdecet==1){
                            $showConsumtion = true;
                            break;
                        }
                    }
                }
                
                $tokenResult = $user->createToken('Personal token for '.$user->username);
                return response()->json([
                    'access_token' => $tokenResult->accessToken,
                    'token_type' => 'Bearer',
                    'expires_at' => Carbon::parse($tokenResult->token->expires_at)->toDateString(),
                    'host' => $user->host,
                    'database' => $user->database,
                    'userId' => $user->id,
                    'osoba' => $user->osoba,
                    'kod_instalace' => $user->kod_instalace,
                    'admin' => $admin,
                    'showConsump' => $showConsumtion
                ]);
            }
        } catch (Exception $exception) {
                return response()->json([
                    'error'=> $exception->getMessage()
                ], 400);
        }
    }
    
    /**
     * Odhlásí uživatele ze systému
     *
     * @param Request $request
     * @return Json
     */
    public function logout(Request $request){
        $request->user()->token()->revoke();
        return response()->json([
            'message' => true
        ]);
    }
}
