<?php
namespace DatabaseHelper\enums;
use DateTime;

enum Type
{
    case INT;
    case FLOAT;
    case STRING;
    case BOOL;
    case ARRAY;
    case DATE;

    public function valCast(mixed $value): mixed {
        return match ($this) {
            self::INT => (int) $value,
            self::FLOAT => (float) $value,
            self::STRING => (string) $value,
            self::BOOL => filter_var($value, FILTER_VALIDATE_BOOLEAN),
            self::ARRAY => is_array($value) ? $value : (json_decode($value, true) ?? []),
            self::DATE => $value instanceof DateTime ? $value : (strtotime($value) ? new DateTime($value) : null),
        };
    }

    public function dbCast(mixed $value): mixed {
        return match ($this) {
            self::INT => intval($value),
            self::FLOAT => floatval($value),
            self::STRING => esc_sql($value),
            self::BOOL => filter_var($value, FILTER_VALIDATE_BOOLEAN) ? "TRUE" : "FALSE",
            self::ARRAY => json_encode($value),
            self::DATE => $value instanceof DateTime ? $value->format('Y-m-d H:i:s') : json_encode($value)
        };
    }

    public function toString(): string {
        return match ($this) {
            self::INT => 'INTEGER',
            self::FLOAT => 'FLOAT',
            self::STRING => 'VARCHAR(255)',
            self::BOOL => 'BOOLEAN',
            self::ARRAY => 'JSON',
            self::DATE => 'DATETIME',
        };
    }
}