<?php

namespace Notes;

use Notes\Common\ReflectedClass;
use Psr\SimpleCache\CacheInterface;

class ObjectResolver {
    public string $objectClass;

    public ReflectedClass $reflectedClass;

    public array $class;

    public array $properties;

    public array $methods;

    public function __construct(string $objectClass, ? CacheInterface $cache = null)
    {
        $this->objectClass = $objectClass;

        $this->reflectedClass = ObjectReflection::fromClass($objectClass, $cache)->reflectClass();
    }

    /**
     * Transform an annotation into it's object's counterpart
     */
    public function getAttributeListFromClassname(array|string $className, bool $throwOnError = true) : array
    {
        $list = [];

        foreach((array) $className as $class) {
            foreach ($this->reflectedClass->getAttributes() as $item) {
                if ($item->object instanceof $class) {
                    $list[] = $item->object;
                }
            }

            foreach ($this->reflectedClass->getProperties(true) as $property) {
                foreach ($property->attributes as $item) {
                    if ($item->object instanceof $class) {
                        $list[$property->name] ??= [];
                        $list[$property->name][] = $item->object;
                    }
                }
            }

            foreach ($this->reflectedClass->getMethods(true) as $method) {
                foreach ($method->attributes as $item) {
                    if ($item->object instanceof $class) {
                        $list[$method->name] ??= [];
                        $list[$method->name][] = $item->object;
                    }
                }
            }
        }

        if ( empty($list) ) {
            if ($throwOnError) throw new \InvalidArgumentException("Class `$className` was not found within {$this->objectClass} uses statement (or it's children / traits)");
        }

        return $list;
    }
}