<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Models\Branch;
use App\Models\NewsletterSignup;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\StreamedResponse;

class NewsletterController extends Controller
{
    public function index(Request $request)
    {
        $signups = $this->filtered($request)->paginate(50)->withQueryString();

        $stats = [
            'total'        => NewsletterSignup::count(),
            'confirmed'    => NewsletterSignup::where('status', 'confirmed')->count(),
            'pending'      => NewsletterSignup::where('status', 'pending')->count(),
            'unsubscribed' => NewsletterSignup::where('status', 'unsubscribed')->count(),
            'whatsapp'     => NewsletterSignup::where('status', 'confirmed')->where('whatsapp_optin', true)->count(),
            'tasting'      => NewsletterSignup::where('status', 'confirmed')->where('tasting_optin', true)->count(),
        ];

        // Filialen aus den Anmeldungen (Freitext-Feld 'store'), ergaenzt um aktive Filialen.
        $stores = NewsletterSignup::whereNotNull('store')
            ->distinct()->orderBy('store')->pluck('store')
            ->merge(Branch::active()->orderBy('name')->pluck('name'))
            ->unique()->sort()->values();

        return view('admin.newsletter.index', compact('signups', 'stats', 'stores'));
    }

    /** CSV-Export der aktuellen Filterauswahl (z.B. fuer Brevo-Import). */
    public function export(Request $request): StreamedResponse
    {
        $rows     = $this->filtered($request)->cursor();
        $filename = 'newsletter-export-' . now()->format('Y-m-d-Hi') . '.csv';

        return response()->streamDownload(function () use ($rows) {
            $out = fopen('php://output', 'w');
            fwrite($out, "\xEF\xBB\xBF"); // BOM: Excel erkennt UTF-8

            fputcsv($out, [
                'E-Mail', 'Anrede', 'Vorname', 'Nachname', 'Geburtsdatum',
                'Filiale', 'Status', 'WhatsApp', 'Mobil', 'Tasting',
                'Code', 'Belohnung', 'Angemeldet', 'Bestaetigt', 'Abgemeldet',
                'UTM Source', 'UTM Medium', 'UTM Campaign',
            ], ';');

            foreach ($rows as $s) {
                fputcsv($out, [
                    $s->email,
                    $s->anrede,
                    $s->vorname,
                    $s->nachname,
                    $s->geburtsdatum?->format('d.m.Y'),
                    $s->store,
                    $s->status,
                    $s->whatsapp_optin ? 'ja' : 'nein',
                    $s->mobile,
                    $s->tasting_optin ? 'ja' : 'nein',
                    $s->voucher_code,
                    $s->reward_type,
                    $s->created_at?->format('d.m.Y H:i'),
                    $s->confirmed_at?->format('d.m.Y H:i'),
                    $s->unsubscribed_at?->format('d.m.Y H:i'),
                    $s->utm_source,
                    $s->utm_medium,
                    $s->utm_campaign,
                ], ';');
            }

            fclose($out);
        }, $filename, ['Content-Type' => 'text/csv; charset=UTF-8']);
    }

    /** Gemeinsame Filterlogik fuer Liste und Export. */
    private function filtered(Request $request)
    {
        $query = NewsletterSignup::query()->latest('id');

        if ($request->filled('status')) {
            $query->where('status', $request->status);
        }
        if ($request->filled('store')) {
            $query->where('store', $request->store);
        }
        if ($request->boolean('whatsapp')) {
            $query->where('whatsapp_optin', true);
        }
        if ($request->boolean('tasting')) {
            $query->where('tasting_optin', true);
        }
        if ($request->filled('q')) {
            $q = trim($request->q);
            $query->where(function ($sub) use ($q) {
                $sub->where('email', 'like', "%{$q}%")
                    ->orWhere('vorname', 'like', "%{$q}%")
                    ->orWhere('nachname', 'like', "%{$q}%")
                    ->orWhere('mobile', 'like', "%{$q}%");
            });
        }
        if ($request->filled('from')) {
            $query->whereDate('created_at', '>=', $request->from);
        }
        if ($request->filled('to')) {
            $query->whereDate('created_at', '<=', $request->to);
        }

        return $query;
    }
}