<?php

namespace App\Media\QuickTime;

use Illuminate\Support\Collection;

use App\Media\QuickTime;
use App\Media\QuickTime\Atoms\moov\{mvhd,trak};

abstract class Atom extends QuickTime
{
	use FindQuicktimeAtoms;

	protected int $offset;
	protected int $size;
	protected string $filename;

	protected Collection $cache;
	protected Collection $atoms;

	public function __construct(int $offset,int $size,string $filename)
	{
		$this->offset = $offset;

		// Quick validation
		if ($size < 0)
			throw new \Exception(sprintf('Atom cannot be negative. (%d)',$size));

		$this->size = $size;
		$this->filename = $filename;
		$this->cache = collect();
	}

	public function __get(string $key): mixed
	{
		switch ($key) {
			// Create time is in the MOOV/MVHD atom
			case 'creation_date':
			case 'duration':
			case 'preferred_rate':
			case 'preferred_volume':
				$subatom = $this->find_atoms(mvhd::class,1);

				return $subatom->{$key};

			// Height is in the moov/trak/tkhd atom
			case 'height':
			// Width is in the moov/trak/tkhd atom
			case 'width':
				$atom = $this->find_atoms(trak::class);

				return $atom->map(fn($item)=>$item->{$key})->filter()->max();

			// Signatures are calculated by the sha of the MDAT atom.
			case 'signature':
				return $this->signature();

			default:
				throw new \Exception('Unknown key: '.$key);
		}
	}
}