<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Models\JobListing;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;

class JobController extends Controller
{
    public function index(Request $request)
    {
        $query = JobListing::withCount(['stages', 'applications'])->latest();

        if ($request->filled('search')) {
            $search = str_replace(['%', '_'], ['\%', '\_'], $request->search);
            $query->where(function ($q) use ($search) {
                $q->where('title', 'like', "%{$search}%")
                  ->orWhere('company', 'like', "%{$search}%");
            });
        }

        $jobs = $query->paginate(15);
        return view('admin.jobs.index', compact('jobs'));
    }

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

    public function store(Request $request)
    {
        $data = $request->validate([
            'title' => 'required|string|max:255',
            'company' => 'required|string|max:255',
            'location' => 'required|string|max:255',
            'type' => 'required|in:Full-time,Part-time,Freelance,Internship,Contract',
            'salary_min' => 'nullable|numeric|min:0',
            'salary_max' => 'nullable|numeric|min:0',
            'requirements' => 'required|string',
            'description' => 'required|string',
            'benefits' => 'nullable|string',
            'is_active' => 'nullable',
            'deadline' => 'nullable|date',
            'company_logo' => 'nullable|image|mimes:jpg,jpeg,png,webp|max:2048',
            'image' => 'nullable|image|mimes:jpg,jpeg,png,webp|max:2048',
        ]);

        $data['is_active'] = $request->has('is_active');

        // Handle file uploads
        if ($request->hasFile('company_logo')) {
            $data['company_logo'] = $request->file('company_logo')->store('jobs/logos', 'public');
        }
        if ($request->hasFile('image')) {
            $data['image'] = $request->file('image')->store('jobs/images', 'public');
        }

        $job = JobListing::create($data);

        // Auto-create 5 default stages
        $defaultStages = [
            1 => ['name' => 'Seleksi Administrasi', 'description' => 'Tahapan seleksi ke-1', 'form_fields' => [
                ['name' => 'motivasi', 'label' => 'Motivasi melamar posisi ini', 'type' => 'textarea', 'required' => true],
                ['name' => 'pengalaman', 'label' => 'Pengalaman kerja yang relevan', 'type' => 'textarea', 'required' => false],
            ]],
            2 => ['name' => 'Tes Kemampuan', 'description' => 'Tahapan seleksi ke-2', 'form_fields' => [
                ['name' => 'keahlian', 'label' => 'Keahlian utama yang dimiliki', 'type' => 'textarea', 'required' => true],
                ['name' => 'pencapaian', 'label' => 'Pencapaian terbaik di pekerjaan sebelumnya', 'type' => 'textarea', 'required' => false],
            ]],
            3 => ['name' => 'Wawancara Awal', 'description' => 'Tahapan seleksi ke-3', 'form_fields' => [
                ['name' => 'kelebihan', 'label' => 'Kelebihan dan kekurangan Anda', 'type' => 'textarea', 'required' => true],
                ['name' => 'gaji_harapan', 'label' => 'Gaji yang diharapkan', 'type' => 'text', 'required' => true],
            ]],
            4 => ['name' => 'Penilaian Lanjutan', 'description' => 'Tahapan seleksi ke-4', 'form_fields' => [
                ['name' => 'ketersediaan', 'label' => 'Kapan bisa mulai bekerja?', 'type' => 'text', 'required' => true],
                ['name' => 'referensi', 'label' => 'Referensi / kontak atasan sebelumnya (jika ada)', 'type' => 'textarea', 'required' => false],
            ]],
            5 => ['name' => 'Interview Final', 'description' => 'Tahapan seleksi ke-5', 'form_fields' => [
                ['name' => 'komitmen', 'label' => 'Konfirmasi kesediaan dan komitmen Anda', 'type' => 'textarea', 'required' => true],
                ['name' => 'pertanyaan', 'label' => 'Pertanyaan untuk perusahaan', 'type' => 'textarea', 'required' => false],
            ]],
        ];

        foreach ($defaultStages as $number => $stageData) {
            $job->stages()->create([
                'stage_number' => $number,
                'name' => $stageData['name'],
                'description' => $stageData['description'],
                'form_fields' => $stageData['form_fields'],
                'is_active' => true,
                'sort_order' => $number,
            ]);
        }

        return redirect()->route('admin.jobs.edit', $job)
            ->with('success', 'Lowongan berhasil ditambahkan dengan 5 tahapan seleksi default.');
    }

    public function show(JobListing $job)
    {
        return redirect()->route('admin.jobs.edit', $job);
    }

    public function edit(JobListing $job)
    {
        $job->load('stages');
        return view('admin.jobs.form', compact('job'));
    }

    public function update(Request $request, JobListing $job)
    {
        $data = $request->validate([
            'title' => 'required|string|max:255',
            'company' => 'required|string|max:255',
            'location' => 'required|string|max:255',
            'type' => 'required|in:Full-time,Part-time,Freelance,Internship,Contract',
            'salary_min' => 'nullable|numeric|min:0',
            'salary_max' => 'nullable|numeric|min:0',
            'requirements' => 'required|string',
            'description' => 'required|string',
            'benefits' => 'nullable|string',
            'is_active' => 'nullable',
            'deadline' => 'nullable|date',
            'company_logo' => 'nullable|image|mimes:jpg,jpeg,png,webp|max:2048',
            'image' => 'nullable|image|mimes:jpg,jpeg,png,webp|max:2048',
        ]);

        $data['is_active'] = $request->has('is_active');

        // Handle image removal first (takes priority over new upload)
        if ($request->has('remove_logo')) {
            if ($job->company_logo) Storage::disk('public')->delete($job->company_logo);
            $data['company_logo'] = null;
        } elseif ($request->hasFile('company_logo')) {
            if ($job->company_logo) Storage::disk('public')->delete($job->company_logo);
            $data['company_logo'] = $request->file('company_logo')->store('jobs/logos', 'public');
        }

        if ($request->has('remove_image')) {
            if ($job->image) Storage::disk('public')->delete($job->image);
            $data['image'] = null;
        } elseif ($request->hasFile('image')) {
            if ($job->image) Storage::disk('public')->delete($job->image);
            $data['image'] = $request->file('image')->store('jobs/images', 'public');
        }

        $job->update($data);

        return redirect()->route('admin.jobs.index')
            ->with('success', 'Lowongan berhasil diperbarui.');
    }

    public function destroy(JobListing $job)
    {
        // Clean up uploaded files
        if ($job->company_logo) Storage::disk('public')->delete($job->company_logo);
        if ($job->image) Storage::disk('public')->delete($job->image);

        $job->delete();
        return redirect()->route('admin.jobs.index')
            ->with('success', 'Lowongan berhasil dihapus.');
    }

    public function copy(Request $request, JobListing $job)
    {
        $data = $request->validate([
            'company' => 'required|string|max:255',
        ]);

        $newCompany = trim($data['company']);
        $sourceCompany = trim((string) $job->company);

        if (strcasecmp($newCompany, $sourceCompany) === 0) {
            return redirect()->back()->with('error', 'Nama perusahaan untuk copy harus berbeda dari lowongan asal.');
        }

        $job->load('stages');

        $copiedJob = DB::transaction(function () use ($job, $newCompany) {
            $newJobData = $job->only([
                'title',
                'location',
                'type',
                'salary_min',
                'salary_max',
                'requirements',
                'description',
                'benefits',
                'is_active',
                'deadline',
            ]);

            $newJobData['company'] = $newCompany;
            // Force logo to be replaced because the copied job is for another company.
            $newJobData['company_logo'] = null;
            $newJobData['image'] = $this->clonePublicFile($job->image, 'jobs/images');

            $newJob = JobListing::create($newJobData);

            foreach ($job->stages as $stage) {
                $newJob->stages()->create([
                    'stage_number' => $stage->stage_number,
                    'name' => $stage->name,
                    'description' => $stage->description,
                    'form_fields' => $stage->form_fields,
                    'is_active' => $stage->is_active,
                    'sort_order' => $stage->sort_order,
                ]);
            }

            return $newJob;
        });

        return redirect()->route('admin.jobs.edit', $copiedJob)
            ->with('success', 'Lowongan berhasil dicopy. Silakan cek dan sesuaikan data perusahaan.');
    }

    private function clonePublicFile(?string $path, string $targetDirectory): ?string
    {
        if (!$path || !Storage::disk('public')->exists($path)) {
            return null;
        }

        $extension = pathinfo($path, PATHINFO_EXTENSION);
        $fileName = uniqid('copy_', true) . ($extension ? '.' . $extension : '');
        $newPath = trim($targetDirectory, '/') . '/' . $fileName;

        Storage::disk('public')->copy($path, $newPath);

        return $newPath;
    }
}
