<?php

namespace App\Models;

use Database\Factories\TargetingSetFactory;
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\Database\Eloquent\Relations\HasMany;
use InvalidArgumentException;

#[Fillable(['brief_id', 'campaign_id', 'platform', 'mode', 'revision', 'schema_version', 'options'])]
class TargetingSet extends Model
{
    /** @use HasFactory<TargetingSetFactory> */
    use HasFactory;

    protected function casts(): array
    {
        return ['options' => 'array'];
    }

    protected static function booted(): void
    {
        static::saving(function (self $set): void {
            if (($set->brief_id === null) === ($set->campaign_id === null)) {
                throw new InvalidArgumentException('A targeting set must belong to exactly one brief or campaign.');
            }
        });
    }

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

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

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