<?php

declare(strict_types=1);

/**
 * @copyright  2021 Ad Aures
 * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
 * @link       https://castopod.org/
 */

namespace Modules\Media\Entities;

use CodeIgniter\Files\File;
use Exception;
use Modules\Media\TranscriptParser;
use Override;

class Transcript extends BaseMedia
{
    public ?string $json_key = null;

    public ?string $json_url = null;

    protected string $type = 'transcript';

    #[Override]
    public function initFileProperties(): void
    {
        parent::initFileProperties();

        if ($this->file_metadata !== null && array_key_exists('json_key', $this->file_metadata)) {
            helper('media');

            $this->json_key = $this->file_metadata['json_key'];
            $this->json_url = service('file_manager')
                ->getUrl($this->json_key);
        }
    }

    #[Override]
    public function setFile(File $file): self
    {
        parent::setFile($file);

        $metadata = lstat((string) $file);

        if (! $metadata) {
            $metadata = [];
        }

        helper('filesystem');

        // set metadata (generated json file path)
        $this->json_key = change_file_path($this->file_key, '', 'json');
        $metadata['json_key'] = $this->json_key;

        $this->attributes['file_metadata'] = json_encode($metadata, JSON_INVALID_UTF8_IGNORE);

        $this->file = $file;

        return $this;
    }

    #[Override]
    public function saveFile(): void
    {
        $this->saveJsonTranscript();

        parent::saveFile();
    }

    #[Override]
    public function deleteFile(): bool
    {
        if (! parent::deleteFile()) {
            return false;
        }

        if ($this->json_key) {
            return service('file_manager')->delete($this->json_key);
        }

        return true;
    }

    private function saveJsonTranscript(): void
    {
        $transcriptContent = file_get_contents($this->file->getRealPath());

        $transcriptParser = new TranscriptParser();

        if ($transcriptContent === false) {
            throw new Exception('Could not read transcript file at ' . $this->file->getRealPath());
        }

        $transcript_format = $this->file->getExtension();
        $transcriptJson = match ($transcript_format) {
            'vtt' => $transcriptParser->loadString($transcriptContent)
                ->parseVtt(),
            default => $transcriptParser->loadString($transcriptContent)
                ->parseSrt(),
        };

        $tempFilePath = WRITEPATH . 'uploads/' . $this->file->getRandomName();
        file_put_contents($tempFilePath, $transcriptJson);

        $newTranscriptJson = new File($tempFilePath, true);

        service('file_manager')
            ->save($newTranscriptJson, $this->json_key);
    }
}
