<?php

namespace App\Models;

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

#[Fillable([
    'user_id', 'platform', 'external_campaign_id', 'local_campaign_id',
    'local_google_ads_campaign_id', 'name', 'objective', 'daily_budget', 'currency',
    'bid_strategy', 'platform_status', 'delivery_status', 'delivery_detail',
    'regions', 'languages', 'platform_learning', 'platform_payload',
    'account_id', 'started_at', 'fetched_at', 'last_error',
])]
class CampaignPerformanceProfile extends Model
{
    protected function casts(): array
    {
        return [
            'daily_budget' => 'decimal:2',
            'regions' => 'array',
            'languages' => 'array',
            'platform_learning' => 'array',
            'platform_payload' => 'array',
            'started_at' => 'date',
            'fetched_at' => 'datetime',
        ];
    }

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

    public function localCampaign(): BelongsTo
    {
        return $this->belongsTo(Campaign::class, 'local_campaign_id');
    }

    public function localGoogleAdsCampaign(): BelongsTo
    {
        return $this->belongsTo(GoogleAdsCampaign::class, 'local_google_ads_campaign_id');
    }

    public function regionLabel(): ?string
    {
        $regions = is_array($this->regions) ? array_values(array_filter($this->regions)) : [];

        if ($regions === []) {
            return null;
        }

        return count($regions) === 1 ? (string) $regions[0] : implode(', ', array_slice($regions, 0, 3))
            .(count($regions) > 3 ? ' +'.(count($regions) - 3) : '');
    }

    public function platformLearningLabel(): ?string
    {
        $learning = is_array($this->platform_learning) ? $this->platform_learning : [];
        $status = trim((string) ($learning['status'] ?? ''));

        return $status !== '' ? $status : null;
    }

    /**
     * @return array<string, mixed>
     */
    public function toSnapshotArray(): array
    {
        return [
            'name' => $this->name,
            'platform' => $this->platform,
            'external_campaign_id' => $this->external_campaign_id,
            'objective' => $this->objective,
            'daily_budget' => $this->daily_budget !== null ? (float) $this->daily_budget : null,
            'currency' => $this->currency,
            'bid_strategy' => $this->bid_strategy,
            'platform_status' => $this->platform_status,
            'delivery_status' => $this->delivery_status,
            'delivery_detail' => $this->delivery_detail,
            'regions' => $this->regions,
            'region_label' => $this->regionLabel(),
            'languages' => $this->languages,
            'platform_learning' => $this->platform_learning,
            'platform_learning_label' => $this->platformLearningLabel(),
            'account_id' => $this->account_id,
            'started_at' => $this->started_at?->toDateString(),
        ];
    }
}
