<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Http\Controllers\Concerns\LogsAdminActions;
use App\Models\Announcement;
use Illuminate\Http\Request;

class AdminAnnouncementController extends Controller
{
    use LogsAdminActions;

    public function index()
    {
        $announcements = Announcement::orderBy('created_at', 'desc')->paginate(20);

        return view('admin.announcements.index', compact('announcements'));
    }

    public function create()
    {
        return view('admin.announcements.create');
    }

    public function store(Request $request)
    {
        $validated = $request->validate([
            'title' => 'required|string|max:255',
            'body' => 'required|string',
            'type' => 'required|in:info,warning,success,promo',
            'display_mode' => 'required|in:modal,banner,both',
            'audience' => 'required|in:all,guests,authenticated',
            'is_active' => 'boolean',
            'is_dismissible' => 'boolean',
            'starts_at' => 'nullable|date_format:Y-m-d\TH:i',
            'expires_at' => 'nullable|date_format:Y-m-d\TH:i|after:starts_at',
        ]);

        // Convert datetime-local format
        if ($validated['starts_at']) {
            $validated['starts_at'] = \Carbon\Carbon::createFromFormat('Y-m-d\TH:i', $validated['starts_at']);
        }
        if ($validated['expires_at']) {
            $validated['expires_at'] = \Carbon\Carbon::createFromFormat('Y-m-d\TH:i', $validated['expires_at']);
        }

        $announcement = Announcement::create($validated);

        $this->auditLog('create_announcement', $announcement, [
            'title' => $announcement->title,
        ]);

        return redirect()->route('admin.announcements.index')
            ->with('success', 'Announcement created successfully!');
    }

    public function edit(Announcement $announcement)
    {
        return view('admin.announcements.edit', compact('announcement'));
    }

    public function update(Request $request, Announcement $announcement)
    {
        $validated = $request->validate([
            'title' => 'required|string|max:255',
            'body' => 'required|string',
            'type' => 'required|in:info,warning,success,promo',
            'display_mode' => 'required|in:modal,banner,both',
            'audience' => 'required|in:all,guests,authenticated',
            'is_active' => 'boolean',
            'is_dismissible' => 'boolean',
            'starts_at' => 'nullable|date_format:Y-m-d\TH:i',
            'expires_at' => 'nullable|date_format:Y-m-d\TH:i|after:starts_at',
        ]);

        // Convert datetime-local format
        if ($validated['starts_at']) {
            $validated['starts_at'] = \Carbon\Carbon::createFromFormat('Y-m-d\TH:i', $validated['starts_at']);
        }
        if ($validated['expires_at']) {
            $validated['expires_at'] = \Carbon\Carbon::createFromFormat('Y-m-d\TH:i', $validated['expires_at']);
        }

        $announcement->update($validated);

        $this->auditLog('update_announcement', $announcement, [
            'title' => $announcement->title,
        ]);

        return redirect()->route('admin.announcements.index')
            ->with('success', 'Announcement updated successfully!');
    }

    public function destroy(Announcement $announcement)
    {
        $title = $announcement->title;
        $announcement->delete();

        $this->auditLog('delete_announcement', null, [
            'title' => $title,
        ]);

        return redirect()->route('admin.announcements.index')
            ->with('success', 'Announcement deleted successfully!');
    }

    public function toggleActive(Announcement $announcement)
    {
        $announcement->update(['is_active' => !$announcement->is_active]);

        $status = $announcement->is_active ? 'activated' : 'deactivated';

        $this->auditLog('toggle_announcement', $announcement, [
            'title' => $announcement->title,
            'is_active' => $announcement->is_active,
        ]);

        return back()->with('success', "Announcement {$status} successfully!");
    }
}
