<?php

namespace Repository;

use Doctrine\ORM\EntityRepository;
use Entity\User;

class UserRepository extends EntityRepository
{
    /**
     * Findet einen User anhand der ID
     */
    public function findById(int $id): ?User
    {
        return $this->find($id);
    }

    /**
     * Findet einen User anhand des Usernames
     */
    public function findByUsername(string $username): ?User
    {
        return $this->findOneBy(['username' => $username]);
    }

    /**
     * Findet einen User anhand der Email
     */
    public function findByEmail(string $email): ?User
    {
        return $this->findOneBy(['email' => $email]);
    }

    /**
     * Findet einen User anhand des Werbenetzwerks
     */
    public function findByWerbenetzwerk(\Entity\Werbenetzwerk $werbenetzwerk): ?User
    {
        return $this->findOneBy(['werbenetzwerk' => $werbenetzwerk]);
    }

    /**
     * Findet alle User
     */
    public function findAllUsers(): array
    {
        return $this->findAll();
    }

    /**
     * Prüft, ob ein Username bereits existiert
     */
    public function usernameExists(string $username): bool
    {
        return $this->findByUsername($username) !== null;
    }

    /**
     * Prüft, ob eine Email bereits existiert
     */
    public function emailExists(string $email): bool
    {
        return $this->findByEmail($email) !== null;
    }

    /**
     * Findet User, die nach einem bestimmten Datum erstellt wurden
     */
    public function findByCreatedAfter(\DateTime $date): array
    {
        return $this->createQueryBuilder('u')
            ->where('u.createdAt > :date')
            ->setParameter('date', $date)
            ->orderBy('u.createdAt', 'DESC')
            ->getQuery()
            ->getResult();
    }

    /**
     * Sucht User nach Username (mit LIKE)
     */
    public function searchByUsername(string $search): array
    {
        return $this->createQueryBuilder('u')
            ->where('u.username LIKE :search')
            ->setParameter('search', '%' . $search . '%')
            ->orderBy('u.username', 'ASC')
            ->getQuery()
            ->getResult();
    }

    /**
     * Zählt alle User
     */
    public function countUsers(): int
    {
        return $this->createQueryBuilder('u')
            ->select('COUNT(u.id)')
            ->getQuery()
            ->getSingleScalarResult();
    }

    /**
     * Speichert einen User
     */
    public function save(User $user): void
    {
        $this->getEntityManager()->persist($user);
        $this->getEntityManager()->flush();
    }

    /**
     * Löscht einen User
     */
    public function delete(User $user): void
    {
        $this->getEntityManager()->remove($user);
        $this->getEntityManager()->flush();
    }
}
