<?php

namespace App\Models;

use Database\Factories\PromptLandingPageAttachmentFactory;
use Illuminate\Database\Eloquent\Attributes\Fillable;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Support\Facades\Storage;

#[Fillable([
    'prompt_landing_page_id', 'prompt_landing_page_message_id',
    'path', 'original_name', 'mime', 'kind', 'included_in_brief',
])]
class PromptLandingPageAttachment extends Model
{
    /** @use HasFactory<PromptLandingPageAttachmentFactory> */
    use HasFactory;

    /**
     * @return array<string, string>
     */
    protected function casts(): array
    {
        return [
            'included_in_brief' => 'boolean',
        ];
    }

    public function page(): BelongsTo
    {
        return $this->belongsTo(PromptLandingPage::class, 'prompt_landing_page_id');
    }

    public function message(): BelongsTo
    {
        return $this->belongsTo(PromptLandingPageMessage::class);
    }

    public function isImage(): bool
    {
        return $this->kind === 'image';
    }

    public function isPdf(): bool
    {
        $mime = strtolower((string) $this->mime);
        $name = strtolower($this->original_name);

        return str_contains($mime, 'pdf') || str_ends_with($name, '.pdf');
    }

    public function previewKind(): string
    {
        if ($this->isImage()) {
            return 'image';
        }

        if ($this->isPdf()) {
            return 'pdf';
        }

        return 'file';
    }

    public function badge(): string
    {
        if ($this->isImage()) {
            return '';
        }

        $extension = strtolower(pathinfo($this->original_name, PATHINFO_EXTENSION));

        return match ($extension) {
            'pdf' => 'PDF',
            'md', 'markdown' => 'MD',
            'txt' => 'TXT',
            default => 'FILE',
        };
    }

    public function absolutePath(): string
    {
        return Storage::disk('local')->path($this->path);
    }

    public function deleteFile(): void
    {
        if (filled($this->path)) {
            Storage::disk('local')->delete($this->path);
        }
    }
}
