<?php
/**
 * BookiFlex Core
 *
 * @package    BookiFlex
 * @subpackage Core
 * @author     BookiFlex
 * @copyright  Copyright (c) 2025 BookiFlex
 * @license    GPL-2.0-or-later
 *
 * @link       https://bookiflex.com
 */

declare(strict_types=1);

namespace BookiFlex\Core\ORM\Typecast;

use BookiFlex\Core\Model\Reservation\ReservationStatus;
use Cycle\ORM\Parser\CastableInterface;
use Cycle\ORM\Parser\UncastableInterface;

defined( 'ABSPATH' ) || exit;

class WPEntityTypecast implements CastableInterface, UncastableInterface
{
    public const ACTIVE_STATUSES = ['publish'];

    public function setRules(array $rules): array
    {
        // Can set rules here if needed
        return $rules;
    }

    public function cast(array $data): array
    {
        if (isset($data['id'])) {
            $data['id'] = (int) $data['id'];
        }

        if (isset($data['active'])) {
            $data['active'] = in_array($data['active'], self::ACTIVE_STATUSES);
        }

        if (isset($data['parent'])) {
            $data['parent'] = empty($data['parent']) ? null : (int) $data['parent'];
        }

        return $data;
    }

    public function uncast(array $data): array
    {
        if (isset($data['status']) && $data['status'] instanceof ReservationStatus) {
            $data['status'] = (string) $data['status'];
        }

        return $data;
    }
}
