<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Models\User;
use App\Models\UserDetail;
use Illuminate\Http\Request;
use Inertia\Inertia;

class CompanyController extends Controller
{
    public function index(Request $request)
    {
        $search = $request->input('search');
        $type = $request->input('type');
        $status = $request->input('status');
        $perPage = $request->input('per_page', 10);

        $userDetails = UserDetail::query()
            ->with(['user'])
            ->when($search, function ($query, $search) {
                return $query->where('company_short_name', 'like', "%{$search}%")
                    ->orWhere('company_full_name', 'like', "%{$search}%")
                    ->orWhere('business_email', 'like', "%{$search}%")
                    ->orWhereHas('user', function ($userQuery) use ($search) {
                        $userQuery->where('name', 'like', "%{$search}%")
                            ->orWhere('email', 'like', "%{$search}%");
                    });
            })
            ->when(is_numeric($type), function ($query) use ($type) {
                return $query->where('type', $type);
            })
            ->when(is_numeric($status), function ($query) use ($status) {
                return $query->where('status', $status);
            })
            ->orderBy('created_at', 'desc')
            ->paginate($perPage);

        return Inertia::render('admin/company/Index', [
            'companies' => $userDetails,
            'filters'   => [
                'search'   => $search,
                'type'     => $type,
                'status'   => $status,
                'per_page' => $perPage,
            ],
            'typeOptions' => [
                ['value' => UserDetail::TYPE_REGULAR_USER, 'label' => 'Regular User'],
                ['value' => UserDetail::TYPE_COMPANY, 'label' => 'Company'],
                ['value' => UserDetail::TYPE_SOFTWARE_TEAM, 'label' => 'Software Development Team'],
                ['value' => UserDetail::TYPE_FREELANCER, 'label' => 'Freelancer'],
            ],
            'statusOptions' => [
                ['value' => UserDetail::STATUS_PENDING, 'label' => 'Pending'],
                ['value' => UserDetail::STATUS_APPROVED, 'label' => 'Approved'],
                ['value' => UserDetail::STATUS_REJECTED, 'label' => 'Rejected'],
            ],
        ]);
    }

    public function create()
    {
        $users = User::all();

        return Inertia::render('admin/company/Create', [
            'users'       => $users,
            'typeOptions' => [
                ['value' => UserDetail::TYPE_REGULAR_USER, 'label' => 'Regular User'],
                ['value' => UserDetail::TYPE_COMPANY, 'label' => 'Company'],
                ['value' => UserDetail::TYPE_SOFTWARE_TEAM, 'label' => 'Software Development Team'],
                ['value' => UserDetail::TYPE_FREELANCER, 'label' => 'Freelancer'],
            ],
            'statusOptions' => [
                ['value' => UserDetail::STATUS_PENDING, 'label' => 'Pending'],
                ['value' => UserDetail::STATUS_APPROVED, 'label' => 'Approved'],
                ['value' => UserDetail::STATUS_REJECTED, 'label' => 'Rejected'],
            ],
        ]);
    }

    public function store(Request $request)
    {
        $validated = $request->validate([
            'user_id'                        => 'nullable|exists:users,id|unique:user_details,user_id',
            'type'                           => 'required|integer|in:0,1,2,3',
            'phone'                          => 'nullable|string|max:20',
            'business_email'                 => 'nullable|email|max:255',
            'company_short_name'             => 'nullable|string|max:255',
            'company_full_name'              => 'nullable|string|max:255',
            'company_description'            => 'nullable|string',
            'rating'                         => 'nullable|numeric|between:0,5',
            'tags'                           => 'nullable|array',
            'employee_count'                 => 'nullable|integer|min:0',
            'engineer_count'                 => 'nullable|integer|min:0',
            'n1_japanese_count'              => 'nullable|integer|min:0',
            'established_year'               => 'nullable|integer|min:1900|max:' . date('Y'),
            'japanese_companies_performance' => 'nullable|integer|min:0',
            'company_logo'                   => 'nullable|string|max:255',
            'strengths'                      => 'nullable|array',
            'leader_name'                    => 'nullable|string|max:255',
            'leader_position'                => 'nullable|string|max:255',
            'establishment_date'             => 'nullable|date',
            'charter_capital'                => 'nullable|numeric|min:0',
            'estimated_value'                => 'nullable|numeric|min:0',
            'headquarters_address'           => 'nullable|string',
            'branches'                       => 'nullable|array',
            'article_link'                   => 'nullable|string|max:255',
            'status'                         => 'required|integer|in:0,1,2',
            'hourly_rate_range'              => 'nullable|string|max:255',
            'key_technologies'               => 'nullable|array',
        ]);

        $userDetail = UserDetail::create($validated);

        return redirect()->route('admin.company.index')
            ->with('success', 'Company created successfully!');
    }

    public function show(UserDetail $userDetail)
    {
        $userDetail->load(['user']);

        return Inertia::render('admin/company/Show', [
            'company' => $userDetail,
        ]);
    }

    public function edit(UserDetail $userDetail)
    {
        $userDetail->load(['user']);

        return Inertia::render('admin/company/Edit', [
            'company'     => $userDetail,
            'typeOptions' => [
                ['value' => UserDetail::TYPE_REGULAR_USER, 'label' => 'Regular User'],
                ['value' => UserDetail::TYPE_COMPANY, 'label' => 'Company'],
                ['value' => UserDetail::TYPE_SOFTWARE_TEAM, 'label' => 'Software Development Team'],
                ['value' => UserDetail::TYPE_FREELANCER, 'label' => 'Freelancer'],
            ],
            'statusOptions' => [
                ['value' => UserDetail::STATUS_PENDING, 'label' => 'Pending'],
                ['value' => UserDetail::STATUS_APPROVED, 'label' => 'Approved'],
                ['value' => UserDetail::STATUS_REJECTED, 'label' => 'Rejected'],
            ],
        ]);
    }

    public function update(Request $request, UserDetail $userDetail)
    {
        $validated = $request->validate([
            'type'                           => 'required|integer|in:0,1,2,3',
            'phone'                          => 'nullable|string|max:20',
            'business_email'                 => 'nullable|email|max:255',
            'company_short_name'             => 'nullable|string|max:255',
            'company_full_name'              => 'nullable|string|max:255',
            'company_description'            => 'nullable|string',
            'rating'                         => 'nullable|numeric|between:0,5',
            'tags'                           => 'nullable|array',
            'employee_count'                 => 'nullable|integer|min:0',
            'engineer_count'                 => 'nullable|integer|min:0',
            'n1_japanese_count'              => 'nullable|integer|min:0',
            'established_year'               => 'nullable|integer|min:1900|max:' . date('Y'),
            'japanese_companies_performance' => 'nullable|integer|min:0',
            'company_logo'                   => 'nullable|string|max:255',
            'strengths'                      => 'nullable|array',
            'leader_name'                    => 'nullable|string|max:255',
            'leader_position'                => 'nullable|string|max:255',
            'establishment_date'             => 'nullable|date',
            'charter_capital'                => 'nullable|numeric|min:0',
            'estimated_value'                => 'nullable|numeric|min:0',
            'headquarters_address'           => 'nullable|string',
            'branches'                       => 'nullable|array',
            'article_link'                   => 'nullable|string|max:255',
            'status'                         => 'required|integer|in:0,1,2',
            'hourly_rate_range'              => 'nullable|string|max:255',
            'key_technologies'               => 'nullable|array',
        ]);

        $userDetail->update($validated);

        return redirect()->route('admin.company.index')
            ->with('success', 'Company updated successfully!');
    }

    public function updateStatus(Request $request, UserDetail $userDetail)
    {
        $validated = $request->validate([
            'status' => 'required|integer|in:0,1,2',
        ]);

        $userDetail->update(['status' => $validated['status']]);

        $statusText = match ($validated['status']) {
            UserDetail::STATUS_APPROVED => 'approved',
            UserDetail::STATUS_REJECTED => 'rejected',
            default                     => 'pending'
        };

        return redirect()->back()
            ->with('success', "Company status has been updated to {$statusText}!");
    }

    public function destroy(UserDetail $userDetail)
    {
        $userDetail->delete();

        return redirect()->route('admin.company.index')
            ->with('success', 'Company deleted successfully!');
    }
}
