<?php

namespace App\Console\Commands;

use App\Enums\SubscriptionStatus;
use App\Models\Payment;
use App\Models\Plan;
use App\Models\Subscription;
use App\Models\User;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;

class ConsolidateSubscriptions extends Command
{
    protected $signature   = 'subscriptions:consolidate {--dry-run : Zeigt was gemacht würde, ohne zu schreiben}';
    protected $description = 'Konsolidiert mehrere Subscription-Zeilen pro User auf eine einzige';

    public function handle(): int
    {
        $dryRun = $this->option('dry-run');

        $freePlan = Plan::freePlan();

        // Alle User mit mehr als einer Subscription
        $userIds = Subscription::select('user_id')
            ->groupBy('user_id')
            ->havingRaw('COUNT(*) > 1')
            ->pluck('user_id');

        if ($userIds->isEmpty()) {
            $this->info('Keine doppelten Subscriptions gefunden.');
            return self::SUCCESS;
        }

        $this->info("Betroffene User: {$userIds->count()}");

        foreach ($userIds as $userId) {
            $subs = Subscription::where('user_id', $userId)
                ->orderByRaw("CASE WHEN status = 'active' THEN 0 ELSE 1 END")
                ->orderByRaw("CASE WHEN provider = 'stripe' THEN 0 ELSE 1 END")
                ->orderBy('created_at', 'desc')
                ->get();

            // Zu behaltende Subscription: aktive Stripe-Sub bevorzugt, sonst neuste aktive, sonst neuste
            $keep = $subs->first();

            // provider_customer_id aus einer beliebigen Sub retten (auch wenn keep sie nicht hat)
            $customerId = $subs->whereNotNull('provider_customer_id')->first()?->provider_customer_id;

            $discard = $subs->where('id', '!=', $keep->id);

            $this->line("User {$userId}: behalte {$keep->id} ({$keep->plan_slug}/{$keep->status}), lösche {$discard->count()} Zeile(n)");

            if ($dryRun) continue;

            DB::transaction(function () use ($keep, $discard, $customerId) {
                // Payments auf die verbleibende Subscription umhängen
                foreach ($discard as $sub) {
                    Payment::where('subscription_id', $sub->id)
                        ->update(['subscription_id' => $keep->id]);
                }

                // Überschüssige Zeilen löschen
                Subscription::whereIn('id', $discard->pluck('id'))->delete();

                // customer_id sichern falls keep sie nicht hatte
                if (!$keep->provider_customer_id && $customerId) {
                    $keep->update(['provider_customer_id' => $customerId]);
                }
            });
        }

        if (!$dryRun) {
            $this->info('Konsolidierung abgeschlossen.');
        } else {
            $this->warn('Dry-run – keine Änderungen geschrieben. Ohne --dry-run ausführen zum Anwenden.');
        }

        return self::SUCCESS;
    }
}
