<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\DataExcel;
use App\Http\Requests\MessageRequest;
use App\Models\Category;
use App\Models\SubCategory;
use App\Models\Tempelete;
use App\Models\Sender;
use App\Models\Message;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Queue;
use App\Jobs\SendMultiMailsJob;
use App\Traits\imagesTrait;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Artisan;
use HTMLPurifier;
use HTMLPurifier_Config;



class MessageController extends Controller
{
    use imagesTrait;
 public function index(Request $request)
{
    $search = $request->query('search');

    $query = Message::query()->with(['sender', 'reciever']); // Eager load the category relationship

     if ($request->has('search') && !empty($request->search)) {
        $search = $request->search;
        $query->where(function ($q) use ($search) {
            $q->where('subject', 'like', "%{$search}%")
                ->orWhereHas('sender', function ($q) use ($search) {
                    $q->where('name', 'like', "%{$search}%")
                      ->orWhere('email', 'like', "%{$search}%");
                })
                ->orWhereHas('reciever', function ($q) use ($search) {
                    $q->where('email', 'like', "%{$search}%");
                })
                ->orWhere('status', 'like', "%{$search}%");
        });
    }
    
    $data['messages'] = $query->orderBy('send_at', 'desc')->paginate(3)->appends(['search' => $request->search]);
    
    $data['sent'] = Message::where('status', 'sent')->count();
    $data['pending'] = Message::where('status', 'pending')->count();
    $data['failed'] = Message::where('status', 'failed')->count(); // Preserve search term in pagination links

    return view('dashboard.Messages.index',$data);
}
public function create(Request $request)
 {
    $ids = $request->has('send_email_ids') ? explode(",", $request->send_email_ids) : [];
    $data['Datas'] = !empty($ids) ? DataExcel::whereIn('id', $ids)->get() : collect([]);

    // Get unique category IDs associated with the selected DataExcel records
    $data['selected_category_ids'] = $data['Datas']->pluck('category_id')->unique()->filter()->toArray();

    $data['tempeletes'] = Tempelete::get();
    $data['messages'] = Message::all();
    $data['categories'] = Category::all();
    $data['subcategories'] = SubCategory::all();
    $data['senders'] = Sender::all();
    $data['recievers'] = !empty($ids) ? $data['Datas'] : DataExcel::all(); // Limit receivers to selected IDs initially

    return view('dashboard.Messages.create', $data);
 }

public function getSubcategoriesReceiversAndSenders(Request $request)
    {
        $categoryIds = $request->query('category_ids', []);
        $senderIds = $request->query('sender_ids', []);

        // Initialize empty arrays
        $subcategories = [];
        $receivers = [];
        $senders = [];

        $senders = Sender::whereIn('id', $senderIds)->select('id', 'email')->get();

        // Fetch subcategories only if category IDs are provided
        if (!empty($categoryIds)) {
            $subcategories = SubCategory::whereIn('category_id', $categoryIds)
                ->select('id', 'name', 'category_id')
                ->get();
        }

        // Fetch receivers only if category IDs are provided
        if (!empty($categoryIds)) {
            $receivers = DataExcel::whereIn('category_id', $categoryIds)
                ->select('id', 'email')
                ->get();
        }

        // Fetch sender emails only if sender IDs are provided
        if (!empty($senderIds)) {
            $senders = Sender::whereIn('id', $senderIds)
                ->select('id', 'email')
                ->get();
        }

        return response()->json([
            'subcategories' => $subcategories,
            'receivers' => $receivers,
            'senders' => $senders
        ]);
    }
   
    public function store(Request $request)
    {
        // dd($request);
        $pathfile = null;
        
        if ($request->has('file')) {
            $pathfile = $this->uploadImageimage($request->file, 'attachemnts'); 
        }

        $dirty_html = $request->input('content');
        $config = HTMLPurifier_Config::createDefault();
        $config->set('Cache.SerializerPath', storage_path('framework/cache/htmlpurifier'));
        $purifier = new HTMLPurifier($config);
        $clean_html = $purifier->purify($dirty_html);
        $message = new Message();
        $message->subject = $request->subject;
        $message->content = $clean_html;
        $message->send_at = now();
        $message->file = $pathfile;
        $message->save();

   
       
        $senders = Sender::whereIn('id', $request->sender_id)->get();
        $receivers = DataExcel::whereIn('id', $request->data_excel_id)->get();
        $content = $request->content;
        $subject = $request->subject;
        
        $senderCount = count($senders);
        $receiverCount = count($receivers);
    
       
        if ($senderCount === 0 || $receiverCount === 0) {
            return response()->json(['message' => 'No senders or receivers found'], 400);
        }
    
        $usedSenders = [];
    
        if ($senderCount >= $receiverCount) {
            for ($i = 0; $i < $receiverCount; $i++) {
                $sender = $senders[$i];
                $receiver = $receivers[$i];


   //    Artisan::call('queue:work', [
//     '--once' => true,
// ]);
                dispatch(new SendMultiMailsJob($sender->name, $sender->email, $receiver->email, $content, $subject, $message));
    
                $usedSenders[$sender->id] = $sender->id; 
            }
        } 
        else {
            $senderIndex = 0;
            foreach ($receivers as $receiver) {
                $sender = $senders[$senderIndex];
    
                dispatch(new SendMultiMailsJob($sender->name, $sender->email, $receiver->email, $content, $subject, $message));
    
                $usedSenders[$sender->id] = $sender->id; 
    
                $senderIndex = ($senderIndex + 1) % $senderCount;
            }
        }
    
      
        $message->sender()->attach(array_values($usedSenders));
        $message->reciever()->attach($request->data_excel_id);
    
        return redirect()->route('message.index')->with('success', 'The message is saved and emails are being sent');
    }
    

    /**
     * Display the specified resource.
     */
    public function show(string $id)
    {
        //
    }
   

    /**
     * Show the form for editing the specified resource.
     */
    public function edit(string $id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     */
    public function update(Request $request, string $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     */
    public function destroy(Request $request,$id)
    {
        $message =  Message::with(['sender','reciever'])->findOrFail($id)->delete();
        return redirect()->route('message.index');
        tosatr()->success('the message are deleted successfully');

    }
    
    public function getSubcategories($categoryId)
     {
        $subcategories = SubCategory::whereIn('category_id', $categoryId)->get(['id', 'name']);

    if ($subcategories->isEmpty()) {
        return response()->json(['message' => 'No subcategories found'], 404);
    }

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

    public function getTemplateData(Request $request)
{
    $templateId = $request->input('template_id');
    $template = Template::find($templateId);
    
    if (!$template) {
        return response()->json(['success' => false]);
    }

    return response()->json([
        'success' => true,
        'template' => [
            'subject' => $template->subject,
            'content' => $template->content
        ]
    ]);
}

    
}