<?php

declare(strict_types=1);

class Usuario extends Model
{
    public function buscarPorEmail(string $email): ?array
    {
        $stmt = $this->db->prepare("SELECT * FROM usuarios WHERE email = :email AND ativo = 1 LIMIT 1");
        $stmt->execute(['email' => $email]);

        $usuario = $stmt->fetch();
        return $usuario ?: null;
    }

    public function todos(): array
    {
        $sql = "SELECT u.*, s.nome AS setor_nome
                FROM usuarios u
                LEFT JOIN setores s ON s.id = u.setor_id
                ORDER BY u.nome ASC";
        return $this->db->query($sql)->fetchAll();
    }

    public function buscarPorId(int $id): ?array
    {
        $stmt = $this->db->prepare("SELECT * FROM usuarios WHERE id = :id LIMIT 1");
        $stmt->execute(['id' => $id]);
        $usuario = $stmt->fetch();
        return $usuario ?: null;
    }

    public function emailEmUso(string $email, ?int $ignorarId = null): bool
    {
        $sql = "SELECT id FROM usuarios WHERE email = :email";
        $params = ['email' => $email];

        if ($ignorarId !== null) {
            $sql .= " AND id <> :id";
            $params['id'] = $ignorarId;
        }

        $sql .= " LIMIT 1";
        $stmt = $this->db->prepare($sql);
        $stmt->execute($params);

        return (bool) $stmt->fetch();
    }

    public function criar(array $dados): int
    {
        $sql = "INSERT INTO usuarios (
                    nome, email, senha, perfil, setor_id, ativo,
                    pode_visualizar_ocorrencias, visualiza_todas_ocorrencias, pode_editar_ocorrencias,
                    criado_em, atualizado_em
                ) VALUES (
                    :nome, :email, :senha, :perfil, :setor_id, :ativo,
                    :pode_visualizar_ocorrencias, :visualiza_todas_ocorrencias, :pode_editar_ocorrencias,
                    NOW(), NOW()
                )";

        $stmt = $this->db->prepare($sql);
        $stmt->bindValue(':nome', $dados['nome']);
        $stmt->bindValue(':email', $dados['email']);
        $stmt->bindValue(':senha', $dados['senha']);
        $stmt->bindValue(':perfil', $dados['perfil']);
        if ($dados['setor_id'] === null) {
            $stmt->bindValue(':setor_id', null, PDO::PARAM_NULL);
        } else {
            $stmt->bindValue(':setor_id', (int) $dados['setor_id'], PDO::PARAM_INT);
        }
        $stmt->bindValue(':ativo', (int) $dados['ativo'], PDO::PARAM_INT);
        $stmt->bindValue(':pode_visualizar_ocorrencias', (int) $dados['pode_visualizar_ocorrencias'], PDO::PARAM_INT);
        $stmt->bindValue(':visualiza_todas_ocorrencias', (int) $dados['visualiza_todas_ocorrencias'], PDO::PARAM_INT);
        $stmt->bindValue(':pode_editar_ocorrencias', (int) $dados['pode_editar_ocorrencias'], PDO::PARAM_INT);
        $stmt->execute();

        return (int) $this->db->lastInsertId();
    }

    public function atualizar(int $id, array $dados): void
    {
        $campos = [
            'nome = :nome',
            'email = :email',
            'perfil = :perfil',
            'setor_id = :setor_id',
            'ativo = :ativo',
            'pode_visualizar_ocorrencias = :pode_visualizar_ocorrencias',
            'visualiza_todas_ocorrencias = :visualiza_todas_ocorrencias',
            'pode_editar_ocorrencias = :pode_editar_ocorrencias',
            'atualizado_em = NOW()',
        ];

        if (!empty($dados['senha'])) {
            $campos[] = 'senha = :senha';
        }

        $sql = "UPDATE usuarios SET " . implode(', ', $campos) . " WHERE id = :id";
        $stmt = $this->db->prepare($sql);
        $stmt->bindValue(':id', $id, PDO::PARAM_INT);
        $stmt->bindValue(':nome', $dados['nome']);
        $stmt->bindValue(':email', $dados['email']);
        $stmt->bindValue(':perfil', $dados['perfil']);
        if ($dados['setor_id'] === null) {
            $stmt->bindValue(':setor_id', null, PDO::PARAM_NULL);
        } else {
            $stmt->bindValue(':setor_id', (int) $dados['setor_id'], PDO::PARAM_INT);
        }
        $stmt->bindValue(':ativo', (int) $dados['ativo'], PDO::PARAM_INT);
        $stmt->bindValue(':pode_visualizar_ocorrencias', (int) $dados['pode_visualizar_ocorrencias'], PDO::PARAM_INT);
        $stmt->bindValue(':visualiza_todas_ocorrencias', (int) $dados['visualiza_todas_ocorrencias'], PDO::PARAM_INT);
        $stmt->bindValue(':pode_editar_ocorrencias', (int) $dados['pode_editar_ocorrencias'], PDO::PARAM_INT);
        if (!empty($dados['senha'])) {
            $stmt->bindValue(':senha', $dados['senha']);
        }
        $stmt->execute();
    }
}
