<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Attributes\Fillable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;

#[Fillable([
    'user_id', 'name', 'platform', 'objective', 'budget', 'currency', 'status',
    'audience', 'locations', 'placements', 'schedule', 'external_campaign_id', 'meta',
    'landing_url', 'ad_account_id', 'page_id', 'pixel_id', 'optimization_goal',
    'bid_strategy', 'bid_amount', 'external_ids', 'last_error',
    'starts_at', 'ends_at', 'published_state', 'last_synced_at',
])]
class Campaign extends Model
{
    protected function casts(): array
    {
        return [
            'audience' => 'array',
            'locations' => 'array',
            'placements' => 'array',
            'schedule' => 'array',
            'meta' => 'array',
            'external_ids' => 'array',
            'published_state' => 'array',
            'starts_at' => 'datetime',
            'ends_at' => 'datetime',
            'last_synced_at' => 'datetime',
            'budget' => 'decimal:2',
            'bid_amount' => 'decimal:2',
        ];
    }

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

    public function campaignCreatives(): HasMany
    {
        return $this->hasMany(CampaignCreative::class);
    }

    /** The ads assembled in chat: an asset plus the words around it. */
    public function ads(): HasMany
    {
        return $this->hasMany(CampaignAd::class);
    }

    /** Changes pushed to this campaign since it went live. */
    public function changes(): HasMany
    {
        return $this->hasMany(CampaignChange::class);
    }

    public function isLive(): bool
    {
        return filled($this->external_campaign_id);
    }
}
