<?php

namespace App\Controllers;
use CodeIgniter\Cookie\Cookie;
use Config\Services;

class logInController extends BaseController
{

    protected $helpers = ['form'];

    public function index()
    {
        // Izveido datu masīvu un ievieto datus
        $data = [];
        $data['page'] = 'logIn';
        $data['active'] = 'login';

        return view('Common', $data);
    }


    public function login()
    {
        $db = \Config\Database::connect();

        // Dabū pieslēgšanās datus
        $username = $this->request->getPost('uname');
        $password = $this->request->getPost('psw');

        // Mēģina dabūt lietotāju ar lietotāju vārdu un paroli no datubāzes
        $query = "SELECT password, identifier FROM users WHERE username = ? LIMIT 1";
        $result = $db->query($query, [$username])->getRow();

        if ($result) {
            $hashedPass = $result->password;

            // Pārbauda vai paroles sakrīt
            if (password_verify($password, $hashedPass)) {
                // Parole ir pareiza

                // Saglabā lietotāja identifikātoru pie sesijas
                session()->set('user_id', $result->identifier);

                // Pārved uz lietotāja informācijas paneli/viktorīnas izveides logu
                return redirect()->to(base_url('create'));
            }
        }

        // Ja parole nav pareiza, tad lietotāju ved atpakaļ uz pieslēgšanās lapu
        $data = [
            'username' => $username,
            'page' => 'logIn',
            'active' => 'login',
            'failure' => true,
        ];

        return view('Common', $data);
    }

    public function logout(){
        //izņem lietotāju identifikātoru no sesijas datiem, un ved uz galveno lapu
        session()->remove('user_id');
        return redirect()->to(base_url('browse'));
    }




    //-----------registrācijas-bloks-sākums-------------
    public function registerIndex()
    {
        //izveido data masīvu, lai pateiktu ko parādīt
        $data = [];
        $data['page'] = 'logIn/register';
        $data['active'] = 'login';
        return view('Common', $data);
    }

    public function registerUser()
    {
        // Izveido savienojumu ar datubāzi
        $db = \Config\Database::connect();
    
        // Izveido masīvu priekš datiem, kurus pārsūtīs uz view
        $data = [];
    
        // Definē pārbaudes noteikumus, priekš iesūtītiem datiem
        $rules = [
            "uname" => "required|max_length[32]",
            "psw" => "required",
            "confirmPsw" => "required",
        ];
    
        // Pārbauda vai dati seko definētiem noteikumiem
        if (!$this->validate($rules)) {
            // Ja neseko, tad atsūta atpakaļ uz reģistrēšanas formu ar kļūdas ziņu
            $data['page'] = 'logIn/register';
            $data['active'] = 'login';
            $data['error'] = 'Failed to validate data';
            return view('Common', $data);
        }
    
        //dabū pārbaudītos datus
        $validData = $this->validator->getValidated();
    
        //pārbauda vai lietotājs ar ievadīto vārdu jau ir reģistrēts
        if(!$this->checkUsername($validData['uname'])){
            // Ja ir, tad atsūta atpakaļ uz reģistrēšanas formu ar kļūdas ziņu
            $data['page'] = 'logIn/register';
            $data['active'] = 'login';
            $data['error'] = 'An account with that username already exists.';
            return view('Common', $data);
        }


        //pārbauda vai ievadītas paroles ir vienādas
        if ($validData['psw'] !== $validData['confirmPsw']) {
            //ja nē, tad atsūtam atpakaļ ar kļūdas ziņu
            $data['page'] = 'logIn/register';
            $data['active'] = 'login';
            $data['error'] = 'Passwords did not match.';
            return view('Common', $data);
        } else {
            //ja ir, tad iešifrē paroli, un reģistrē lietotāju datubāzē
            $hashedPass = password_hash($validData['psw'], PASSWORD_BCRYPT);
    
            //izveido masīvu ar datiem, kurus ievietos datubāzē
            $userData = [
                'username' => $validData['uname'],
                'password' => $hashedPass,
                'identifier' => $this->generateIdentifier()
            ];
    
            // Ievieto datus datubāzē
            $builder = $db->table('users');
            $builder->insert($userData);
    
            // pārved lietotāju uz veiksmīgu reģistrēšanās ekrānu
            // !! pievienot vajag veiksmīgu reģistrēšanās logu
            // pašlaik pārnes uz pieslēgšanās ekrānu

            $data['page'] = 'logIn';
            $data['active'] = 'login';
            return view('Common', $data);
        }
    }

    public function generateIdentifier()
    {
        // Izveido savienojumu ar datubāzi
        $db = \Config\Database::connect();

        // Definē identifikācijas mainīgo
        $generatedIdentifier = '';


        do {
            // Ģenerē identifikātoru
            $generatedIdentifier = bin2hex(random_bytes(32)); 

            // pārbauda vai identifikātors existē datubāzē
            $builder = $db->table('users');
            $builder->select('identifier');
            $builder->where('identifier', $generatedIdentifier);
            $query = $builder->get();

            // ja ir jau tāds identifikātors, izveido jaunu
        } while ($query->getResult());

        //kad dabūts jauns unikāls identifikātors, atved to.
        return $generatedIdentifier;
    }

    //-----------------reģistrācijas-bloks-beigas-----------------

    public function checkUsername($username){
        //izveido savienojumu ar datubāzi
        $db = \Config\Database::connect();

        //dabū vai tāds lietotāju vārds jau existē
        $builder = $db->table('users');
        $builder->select('username');
        $builder->where('username', $username);
        $query = $builder->get();

        //pārbauda vai tika atrasts rezultāts
        if($query->getResult()){
            // ja tika, tad atved atpakaļ false
            return false;
        }
        //citādi atved atpakaļ true
        return true;
    }
}

