<?php

namespace App\Patient\Entity;

use App\Auth\Entity\User;
use App\Patient\Repository\PatientRecordRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Uid\Uuid;

#[ORM\Entity(repositoryClass: PatientRecordRepository::class)]
#[ORM\Table(name: 'patient_records')]
#[ORM\UniqueConstraint(name: 'uniq_patient_record', columns: ['entity_type', 'entity_id', 'user_id'])]
class PatientRecord
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column(type: 'integer')]
    private ?int $id = null;

    #[ORM\Column(type: 'string', length: 36, unique: true)]
    private string $uuid;

    #[ORM\Column(name: 'entity_type', type: 'string', length: 10)]
    private string $entityType;

    #[ORM\Column(name: 'entity_id', type: 'integer')]
    private int $entityId;

    #[ORM\ManyToOne(targetEntity: User::class)]
    #[ORM\JoinColumn(nullable: false, onDelete: 'RESTRICT')]
    private User $user;

    #[ORM\Column(name: 'created_by_type', type: 'string', length: 15)]
    private string $createdByType;

    #[ORM\Column(name: 'created_by_id', type: 'integer')]
    private int $createdById;

    #[ORM\Column(name: 'created_at', type: 'integer')]
    private int $createdAt;

    #[ORM\OneToMany(targetEntity: PatientSession::class, mappedBy: 'record', cascade: ['remove'])]
    private Collection $sessions;

    public function __construct(string $entityType, int $entityId, User $user, string $createdByType, int $createdById)
    {
        $this->uuid          = Uuid::v4()->toRfc4122();
        $this->entityType    = $entityType;
        $this->entityId      = $entityId;
        $this->user          = $user;
        $this->createdByType = $createdByType;
        $this->createdById   = $createdById;
        $this->createdAt     = time();
        $this->sessions      = new ArrayCollection();
    }

    public function getId(): ?int          { return $this->id; }
    public function getUuid(): string      { return $this->uuid; }
    public function getEntityType(): string { return $this->entityType; }
    public function getEntityId(): int     { return $this->entityId; }
    public function getUser(): User        { return $this->user; }
    public function getCreatedByType(): string { return $this->createdByType; }
    public function getCreatedById(): int  { return $this->createdById; }
    public function getCreatedAt(): int    { return $this->createdAt; }

    public function toArray(): array
    {
        return [
            'uuid'             => $this->uuid,
            'entity_type'      => $this->entityType,
            'entity_id'        => $this->entityId,
            'user_uuid'        => $this->user->getUuid(),
            'user_name'          => $this->user->getRealName(),
            'user_mobile'        => $this->user->getMobileNumber(),
            'user_national_code' => $this->user->getNationalCode(),
            'created_by_type'  => $this->createdByType,
            'created_at'       => $this->createdAt,
        ];
    }
}
