<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Job;
use App\Models\JobSubmission;
use App\Models\IncomeHistory;
use App\Models\BalanceLog;
use App\Services\VoucherTransactionService;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;

class UserJobController extends Controller
{
    /**
     * সব approved জব দেখাবে
     * আপডেট: শুধু সেই কাজগুলো দেখাবে যা ইউজার এখনো করেনি অথবা রিজেক্ট হয়েছে
     */
    public function index()
    {
        $userId = auth()->id();

        $jobs = Job::where('status', 'approved')
            ->whereRaw('(`limit` - completed_count) > 0')
            ->where(function ($query) use ($userId) {
                // ১. ইউজার এখনো সাবমিট করেনি এমন কাজ
                $query->whereDoesntHave('submissions', function ($q) use ($userId) {
                    $q->where('user_id', $userId);
                })
                // ২. অথবা সাবমিট করেছে কিন্তু অ্যাডমিন রিজেক্ট করেছে (তাই আবার দেখাবে)
                ->orWhereHas('submissions', function ($q) use ($userId) {
                    $q->where('user_id', $userId)
                      ->where('status', 'rejected');
                });
            })
            ->latest()
            ->get();

        return view('microjobs.index', compact('jobs'));
    }

    public function show($id)
    {
        $job = Job::findOrFail($id);
        $userId = auth()->id();
        
        // সুরক্ষার জন্য: চেক করছি ইউজার আগে করেছে কিনা এবং স্ট্যাটাস কি
        $existing = JobSubmission::where('user_id', $userId)
            ->where('job_id', $job->id)
            ->first();

        // যদি পেন্ডিং বা অ্যাপ্রুভ থাকে, তবে শো পেজে ঢুকতে দেবে না
        if ($existing && $existing->status !== 'rejected') {
            return redirect()->route('microjobs.index')->with('error', 'এই কাজটি ইতিমধ্যে সম্পন্ন বা রিভিউতে আছে।');
        }

        return view('microjobs.show', compact('job'));
    }

    /**
     * ইউজারের সাবমিশন
     * আপডেট: রিজেক্ট হওয়া কাজ পুনরায় সাবমিট করার সুযোগ
     */
    public function submit(Request $request, $id)
    {
        $request->validate([
            'proof_link' => 'required|url'
        ]);

        $job = Job::findOrFail($id);
        $userId = auth()->id();

        // আগের সাবমিশন চেক
        $already = JobSubmission::where('user_id', $userId)
            ->where('job_id', $job->id)
            ->first();

        if ($already) {
            // যদি আগে রিজেক্ট হয়ে থাকে, তবে আগেরটা ডিলিট করে নতুনটা নেবে
            if ($already->status === 'rejected') {
                $already->delete();
            } else {
                return redirect()->route('microjobs.index')->with('error', 'আপনি এই কাজ ইতিমধ্যে একবার করেছেন।');
            }
        }

        JobSubmission::create([
            'user_id' => $userId,
            'job_id' => $job->id,
            'proof_link' => $request->proof_link,
            'status' => 'pending'
        ]);

        return redirect()->route('microjobs.index')->with('success', 'সাবমিশন সফল হয়েছে! রিভিউর জন্য অপেক্ষা করুন।');
    }

    // অ্যাডমিন/মডারেটর সাবমিশন আপডেট করবে
    public function update(Request $request, $id)
    {
        $submission = JobSubmission::findOrFail($id);
        $job = $submission->job;

        $oldStatus = $submission->status;
        $newStatus = $request->status;

        // approved → rejected হলে count কমানো
        if ($oldStatus === 'approved' && $newStatus === 'rejected') {
            if ($job->completed_count > 0) {
                $job->decrement('completed_count');
            }
        }

        // pending → approved হলে ইউজারের মেইন ব্যালেন্স বাড়ানো
        if ($oldStatus === 'pending' && $newStatus === 'approved') {
            $user = $submission->user;
            $user->increment('balance', $job->amount);

            BalanceLog::create([
                'user_id' => $user->id,
                'amount'  => $job->amount,
            ]);

            IncomeHistory::create([
                'user_id'     => $user->id,
                'source'      => 'micro_job',
                'amount'      => $job->amount,
                'description' => 'অভিনন্দন! আপনি মাইক্রো জবের "'.$job->title.'" কাজ সফলভাবে সম্পন্ন করে '.$job->amount.'৳ ইনকাম পেয়েছেন।',
            ]);
        }

        $submission->status = $newStatus;
        $submission->save();

        return back()->with('success', 'সাবমিশন স্ট্যাটাস আপডেট হয়েছে।');
    }

    public function userFilteredHistory(Request $request)
    {
        $status = $request->get('status', 'pending');

        $submissions = JobSubmission::with('job')
            ->where('user_id', auth()->id())
            ->when(in_array($status, ['pending', 'approved', 'rejected']), function ($query) use ($status) {
                return $query->where('status', $status);
            })
            ->latest()
            ->get();

        return view('user.job_history.index', [
            'submissions' => $submissions,
            'status' => $status,
        ]);
    }

    public function create()
    {
        return view('user.jobs.create');
    }

    public function store(Request $request)
    {
        $request->validate([
            'title' => 'required|string|max:255',
            'description' => 'required|string',
            'link' => 'required|url',
            'amount' => 'required|numeric|min:0.20',
            'limit' => 'required|integer|min:50',
            'photo' => 'required|image|mimes:jpeg,png,jpg|max:2048',
        ], [
            'amount.min' => 'অ্যামাউন্ট কমপক্ষে 0.20 টাকা হতে হবে।',
        ]);

        $total = $request->amount * $request->limit;
        $charge = ($total * 5) / 100;
        $totalWithCharge = $total + $charge;

        $user = Auth::user();

        if ((float)($user->voucher_balance ?? 0) < $totalWithCharge) {
            return back()->withErrors([
                'voucher_balance' => 'আপনার ভাউচার ব্যালেন্স পর্যাপ্ত নয়।'
            ])->withInput();
        }

        DB::beginTransaction();
        try {
            $lockedUser = \App\Models\User::whereKey($user->id)->lockForUpdate()->firstOrFail();

            $beforeVoucher = (float) ($lockedUser->voucher_balance ?? 0);
            if ($beforeVoucher < $totalWithCharge) {
                throw new \RuntimeException('আপনার ভাউচার ব্যালেন্স পর্যাপ্ত নয়।');
            }

            $afterVoucher = $beforeVoucher - $totalWithCharge;
            $lockedUser->voucher_balance = $afterVoucher;
            $lockedUser->save();

            $job = new Job();
            $job->title = $request->title;
            $job->description = $request->description;
            $job->link = $request->link;
            $job->amount = $request->amount;
            $job->limit = $request->limit;
            $job->user_id = $lockedUser->id;
            $job->status = 'pending';
            $job->total_cost = $totalWithCharge;

            if ($request->hasFile('photo')) {
                $photo = $request->file('photo');
                $photoName = time() . '_' . Str::random(10) . '.' . $photo->getClientOriginalExtension();
                $photo->move(public_path('images/jobs'), $photoName);
                optimize_uploaded_image(public_path('images/jobs') . DIRECTORY_SEPARATOR . $photoName);
                $job->photo = 'images/jobs/' . $photoName;
            }

            $job->save();

            VoucherTransactionService::record(
                userId: (int) $lockedUser->id,
                direction: 'debit',
                amount: (float) $totalWithCharge,
                before: $beforeVoucher,
                after: $afterVoucher,
                source: 'job_posting_debit',
                description: 'জব পোস্ট #' . $job->id . ' করার জন্য ভাউচার কাটা হয়েছে।',
                referenceType: 'job',
                referenceId: $job->id,
                metadata: [
                    'limit' => (int) $request->limit,
                    'amount_per_job' => (float) $request->amount,
                    'charge_included' => true,
                ]
            );

            DB::commit();

            return redirect()->route('user.jobs.create')->with('success', 'জব তৈরি হয়েছে এবং অ্যাডমিন রিভিউ করবে!');
        } catch (\Exception $e) {
            DB::rollBack();
            return back()->with('error', $e->getMessage() ?: 'দুঃখিত, কিছু সমস্যা হয়েছে।');
        }
    }

    public function myPostedJobs()
    {
        $jobs = Job::where('user_id', auth()->id())->latest()->get();
        return view('user.jobs.history', compact('jobs'));
    }

    public function submissions($jobId)
    {
        $job = Job::with('submissions.user')
            ->where('id', $jobId)
            ->where('user_id', auth()->id())
            ->firstOrFail();

        return view('user.jobs.submissions', compact('job'));
    }

    public function updateSubmissionStatus(Request $request, $submissionId)
    {
        $request->validate(['status' => 'required|in:approved,rejected']);
        $submission = JobSubmission::with('job', 'user')->findOrFail($submissionId);

        if ($submission->job->user_id !== auth()->id()) abort(403);
        if ($submission->status !== 'pending') return back()->with('error', 'ইতিমধ্যে আপডেট করা হয়েছে।');

        DB::beginTransaction();
        try {
            $submission->status = $request->status;
            $submission->save();

            if ($request->status === 'approved') {
                $submission->job->increment('completed_count');
                $worker = $submission->user;
                $worker->increment('balance', $submission->job->amount);

                BalanceLog::create([
                    'user_id' => $worker->id,
                    'amount'  => $submission->job->amount,
                ]);

                IncomeHistory::create([
                    'user_id'     => $worker->id,
                    'source'      => 'micro_job',
                    'amount'      => $submission->job->amount,
                    'description' => 'অভিনন্দন! আপনি কাজ সম্পন্ন করে পেমেন্ট পেয়েছেন।',
                ]);
            }
            DB::commit();
            return back()->with('success', 'সাবমিশন আপডেট হয়েছে!');
        } catch (\Exception $e) {
            DB::rollBack();
            return back()->with('error', 'সমস্যা হয়েছে।');
        }
    }

    public function showPendingSubmissions($jobId)
    {
        $job = Job::with(['submissions.user'])->where('id', $jobId)->where('user_id', auth()->id())->firstOrFail();
        $submissions = $job->submissions()->where('status', 'pending')->get();
        return view('user.jobs.submissions_pending', compact('job', 'submissions'));
    }

    public function showReviewedSubmissions($jobId)
    {
        $job = Job::with(['submissions.user'])->where('id', $jobId)->where('user_id', auth()->id())->firstOrFail();
        $submissions = $job->submissions()->whereIn('status', ['approved', 'rejected'])->orderBy('updated_at', 'desc')->get();
        return view('user.jobs.submissions_reviewed', compact('job', 'submissions'));
    }
}
