<?php
require_once "./Controller/Database.php";
require_once "./Controller/Setting.php";

class Users extends BD {

    private $PARM;
    function __construct() {
        $this->PARM = new Setting();
    }

    public function GET() {
        $this->Permission();
        if(is_null($this->id) || $this->id==0){
            $query = $this->consult("SELECT id, nombre, false AS activo FROM auth.roles ORDER BY nombre");
            $query->execute();
            $roles = $query->fetchAll(PDO::FETCH_ASSOC);
            //$query = $this->consult("SELECT id, name, activo FROM auth.group ORDER BY name");
            //$query->execute();
            //$group = $query->fetchAll(PDO::FETCH_ASSOC);
            $query = $this->consult("SELECT * FROM auth.vuser ORDER BY name, lastname");
            $query->execute();
            $users = $query->fetchAll(PDO::FETCH_ASSOC);
            $this->data = array(
                'roles' => $roles,
                //'group' => $group,
                'users' => $users,
            );
            $this->httpHeaders = 200;
        } else {
            $rol = array();
            $query = $this->consult("SELECT * FROM auth.roles WHERE activo ORDER BY nombre");
            $query->execute();
            $roles = $query->fetchAll(PDO::FETCH_ASSOC);            
            for ($i = 0; $i < count($roles); $i++) {
                $rol[$i] = $roles[$i];
                $query = $this->consult("SELECT * FROM auth.role_user WHERE activo AND userid=? AND role=?");
                $query->execute([$this->id,$roles[$i]['id']]);
                if($query->fetchAll(PDO::FETCH_ASSOC)){
                    $rol[$i]['activo'] = true;
                } else {
                    $rol[$i]['activo'] = false;
                }    
            }
            $this->data = $rol;
            $this->httpHeaders = 200;
        }
    }

    public function POST() {
        $this->Permission();
        $input = $this->input;
        $dat = array(
            ':usuario' => $input->usuario,
            ':name' => $input->name,
            ':lastname' => $input->lastname,
            ':email' => $input->email,
            ':cedula' => $input->cedula,
            ':activo' => $this->Booleano($input->activo),
            ':created_by' => $this->userid,
        ); 
        $query = $this->consult("INSERT INTO auth.users (usuario,name,lastname,email,cedula,activo,created_by,created_at) 
            VALUES (:usuario,:name,:lastname,:email,:cedula,:activo,:created_by,now())");
        if($query->execute($dat)){
            $this->httpHeaders = 201;
            $query = $this->consult("SELECT id FROM auth.users WHERE email=?");
            $query->execute([$input->email]);
            $result = $query->fetchAll(PDO::FETCH_ASSOC);
            $userid = $result[0]['id'];
            foreach ($input->roles as $rol){
                $query = $this->consult("INSERT INTO auth.role_user (userid,role,activo,created_by,created_at) 
                    VALUES (:userid,:role,:activo,:created_by,now())");
                $query->bindParam(":userid", $userid);
                $query->bindParam(":role", $rol->id);
                $query->bindParam(":created_by", $this->userid);
                $query->bindParam(":activo", $rol->activo);
            }
            $query = $this->consult("DELETE FROM auth.role_user WHERE activo='f' AND userid=?");
            $query->execute([$userid]);
            $this->httpHeaders = 200;
        }
    }

    public function PUT() {
        $this->Permission();
        $input = $this->input;
        foreach ($input->roles as $rol){
            $query = $this->consult("SELECT * FROM auth.role_user WHERE userid=? AND role=?");
            $query->execute([$this->id,$rol->id]);              
            $consult = $query->fetchAll(PDO::FETCH_ASSOC);
            if (!$rol->activo){$rol->activo = 0;}
            if ($consult) {
                $query = $this->consult('UPDATE auth.role_user SET activo=?,edited_at=now() WHERE id=?');
                $query->execute([$rol->activo,$consult[0]['id']]);       
            } else  {
                $query = $this->consult('INSERT INTO auth.role_user ("userid","role","activo",created_by,created_at) VALUES (?,?,?,?,now())');
                $query->execute([$this->id,$rol->id,$rol->activo,$this->userid]);                   
            }
        }
        $query = $this->consult('UPDATE auth.users SET usuario=:usuario,name=:name,lastname=:lastname,email=:email,cedula=:cedula,
            activo=:activo,edited_by=:edited_by, edited_at=now()
            WHERE id=:id');
        $query->bindParam(":usuario", $input->usuario);
        $query->bindParam(":name", $input->name);
        $query->bindParam(":lastname", $input->lastname);
        $query->bindParam(":email", $input->email);
        $query->bindParam(":cedula", $input->cedula);
        $query->bindParam(":activo", $input->activo,PDO::PARAM_BOOL);
        $query->bindParam(":edited_by", $this->userid);
        $query->bindParam(":id", $this->id);
        if($query->execute()){
            $this->httpHeaders = 200;
            $query = $this->consult("DELETE FROM auth.role_user WHERE activo='f' AND userid=?");
            $query->execute([$this->id]);
        }
    }

    public function DELETE() {
        $this->Permission();
        $query = $this->consult("DELETE FROM auth.role_user WHERE userid=:id");
        $query->bindParam(":id", $this->id);
        $query->execute();
        $query = $this->consult("DELETE FROM auth.users WHERE id=:id");
        if($query->execute([$this->id])){
            $this->httpHeaders = 200;
        }
    }

}