<?php

namespace App\Http\Controllers;

use App\Models\Ticket;
use App\Models\TicketDepartment;
use App\Models\TicketReply;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;

class TicketController extends Controller
{
    public function index()
    {
        $tickets = Ticket::with('department')
            ->where('uid', Auth::id())
            ->latest()
            ->paginate(10);

        return view('panel.tickets.index', compact('tickets'));
    }

    public function create()
    {
        $departments = TicketDepartment::active()->orderBy('name')->get();

        $orders = \App\Models\Order::where('user_id', Auth::id())
            ->latest()
            ->get();

        return view('panel.tickets.create', compact('departments', 'orders'));
    }

    public function store(Request $request)
    {
        $validated = $request->validate([
            'subject'       => 'required|string|max:255',
            'department_id' => 'required|exists:ticket_departments,id',
            'order_id'      => 'nullable|exists:orders,id',
            'message'       => 'required|string|max:5000',
            'attachment'    => 'nullable|image|mimes:jpeg,jpg,png,gif,webp|max:5120',
        ], [
            'subject.required'       => 'موضوع تیکت الزامی است.',
            'department_id.required' => 'انتخاب دپارتمان الزامی است.',
            'department_id.exists'   => 'دپارتمان انتخابی معتبر نیست.',
            'message.required'       => 'متن پیام الزامی است.',
            'attachment.image'       => 'فقط فایل تصویری مجاز است.',
            'attachment.mimes'       => 'فرمت تصویر مجاز نیست (jpg، png، gif، webp).',
            'attachment.max'         => 'حداکثر حجم تصویر ۵ مگابایت است.',
        ]);

        // Ensure the selected order belongs to the authenticated user
        $orderId = null;
        if (!empty($validated['order_id'])) {
            $orderId = \App\Models\Order::where('id', $validated['order_id'])
                ->where('user_id', Auth::id())
                ->value('id');
        }

        $attachment = $this->storeAttachment($request);

        $ticket = DB::transaction(function () use ($validated, $attachment, $orderId) {
            $ticket = Ticket::create([
                'uid'            => Auth::id(),
                'department_id'  => $validated['department_id'],
                'order_id'       => $orderId,
                'name'           => Ticket::generateName(),
                'subject'        => $validated['subject'],
                'status'         => 'opened',
                'shamsi_created' => Ticket::shamsiNow(),
                'shamsi_updated' => Ticket::shamsiNow(),
            ]);

            TicketReply::create([
                'ticket_id'      => $ticket->id,
                'sender'         => 'user',
                'message'        => $validated['message'],
                'attachment'     => $attachment,
                'shamsi_created' => Ticket::shamsiNow(),
            ]);

            return $ticket;
        });

        return redirect()->route('tickets.show', $ticket->name)
            ->with('success', 'تیکت شما با موفقیت ثبت شد.');
    }

    public function show(Ticket $ticket)
    {
        abort_unless($ticket->uid === Auth::id(), 403);

        $ticket->load(['replies', 'department', 'order']);

        return view('panel.tickets.show', compact('ticket'));
    }

    public function reply(Request $request, Ticket $ticket)
    {
        abort_unless($ticket->uid === Auth::id(), 403);

        if ($ticket->isClosed()) {
            return back()->with('error', 'این تیکت بسته شده و امکان ارسال پاسخ وجود ندارد.');
        }

        $validated = $request->validate([
            'message'    => 'required|string|max:5000',
            'attachment' => 'nullable|image|mimes:jpeg,jpg,png,gif,webp|max:5120',
        ], [
            'message.required' => 'متن پیام الزامی است.',
            'attachment.image' => 'فقط فایل تصویری مجاز است.',
            'attachment.mimes' => 'فرمت تصویر مجاز نیست (jpg، png، gif، webp).',
            'attachment.max'   => 'حداکثر حجم تصویر ۵ مگابایت است.',
        ]);

        $attachment = $this->storeAttachment($request);

        DB::transaction(function () use ($ticket, $validated, $attachment) {
            TicketReply::create([
                'ticket_id'      => $ticket->id,
                'sender'         => 'user',
                'message'        => $validated['message'],
                'attachment'     => $attachment,
                'shamsi_created' => Ticket::shamsiNow(),
            ]);

            $ticket->update([
                'status'         => 'user_replied',
                'shamsi_updated' => Ticket::shamsiNow(),
            ]);
        });

        return back()->with('success', 'پاسخ شما ثبت شد.');
    }

    private function storeAttachment(Request $request): ?string
    {
        if (!$request->hasFile('attachment')) {
            return null;
        }

        if (!is_dir(public_path('uploads/tickets'))) {
            mkdir(public_path('uploads/tickets'), 0755, true);
        }

        $file     = $request->file('attachment');
        $ext      = $file->getClientOriginalExtension();
        $filename = 'ticket-' . time() . '-' . random_int(1000, 9999) . '.' . $ext;
        $file->move(public_path('uploads/tickets'), $filename);

        return $filename;
    }
}
