<?php

namespace App\Http\Controllers;

use App\Jobs\ProcessarNotificacao;
use App\Models\Notificacao;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class NotificacaoController extends Controller
{
    public function index()
    {
        $notificacoes = Auth::user()
            ->notificacoes()
            ->with(['credencial', 'produto'])
            ->latest()
            ->get();

        $credenciais = Auth::user()->credenciais()->get();
        $produtos = Auth::user()->produtos()->get();

        return view('notificacao', compact('notificacoes', 'credenciais', 'produtos'));
    }

    public function store(Request $request)
    {
        $request->validate([
            'credencial_id' => 'required|exists:credenciais,id',
            'produto_id' => 'required|exists:produtos,id',
            'quantidade_transacoes' => 'required|integer|min:1',
            'metodo_pagamento' => 'required|in:pix,credit_card',
            'taxa_aprovacao' => 'nullable|integer|min:0|max:100',
            'tempo_unidade' => 'required|in:minutos,horas',
            'tempo_valor' => 'required|integer|min:1',
        ]);

        $credencial = Auth::user()->credenciais()->findOrFail($request->credencial_id);
        $produto = Auth::user()->produtos()->findOrFail($request->produto_id);

        $notificacao = Auth::user()->notificacoes()->create([
            'credencial_id' => $credencial->id,
            'produto_id' => $produto->id,
            'quantidade_transacoes' => $request->quantidade_transacoes,
            'metodo_pagamento' => $request->metodo_pagamento,
            'taxa_aprovacao' => $request->metodo_pagamento === 'pix' ? $request->taxa_aprovacao : 100,
            'tempo_unidade' => $request->tempo_unidade,
            'tempo_valor' => $request->tempo_valor,
            'status' => 'pendente',
        ]);

        ProcessarNotificacao::dispatch($notificacao->id);

        if ($request->expectsJson()) {
            return response()->json([
                'success' => true,
                'message' => 'Notificação criada e processamento iniciado!'
            ]);
        }

        return redirect()->route('notificacao')->with('success', 'Notificação criada e processamento iniciado!');
    }

    public function list()
    {
        $notificacoes = Auth::user()
            ->notificacoes()
            ->with(['credencial', 'produto'])
            ->latest()
            ->get();

        return response()->json($notificacoes);
    }

    public function iniciar(Notificacao $notificacao)
    {
        if ($notificacao->user_id !== Auth::id()) {
            abort(403);
        }

        if ($notificacao->status !== 'pendente') {
            return back()->with('error', 'Apenas notificações pendentes podem ser iniciadas.');
        }

        $phpPath = PHP_BINARY;
        $artisanPath = base_path('artisan');
        $url = url('/processar-notificacao/' . $notificacao->id);

        $command = sprintf(
            'curl -s -m 7200 %s > /dev/null 2>&1 &',
            escapeshellarg($url)
        );

        exec($command);

        return redirect()->route('notificacao')->with('success', 'Notificação iniciada com sucesso!');
    }

    public function pausar(Notificacao $notificacao)
    {
        if ($notificacao->user_id !== Auth::id()) {
            abort(403);
        }

        if ($notificacao->status !== 'processando') {
            return back()->with('error', 'Apenas notificações em processamento podem ser pausadas.');
        }

        $notificacao->update(['pausada' => true]);

        return redirect()->route('notificacao')->with('success', 'Notificação pausada com sucesso!');
    }

    public function retomar(Notificacao $notificacao)
    {
        if ($notificacao->user_id !== Auth::id()) {
            abort(403);
        }

        if ($notificacao->status !== 'processando' || !$notificacao->pausada) {
            return back()->with('error', 'Apenas notificações pausadas podem ser retomadas.');
        }

        $notificacao->update(['pausada' => false]);

        ProcessarNotificacao::dispatch($notificacao->id);

        return redirect()->route('notificacao')->with('success', 'Notificação retomada com sucesso!');
    }

    public function destroy(Notificacao $notificacao)
    {
        if ($notificacao->user_id !== Auth::id()) {
            abort(403);
        }

        if ($notificacao->status === 'processando') {
            $notificacao->update(['pausada' => true]);
        }

        $notificacao->delete();

        return redirect()->route('notificacao')->with('success', 'Notificação excluída com sucesso!');
    }
}
