<?php

namespace App\Controllers\Admin;

use App\Controllers\BaseController;
use App\Models\CompanyModel;
use App\Models\UserModel;

/**
 * إدارة مستخدمي لوحة الأدمن (مدراء الشركات).
 * - مدير الشركة: يشوف ويضيف مستخدمين لشركته فقط.
 * - السوبر أدمن: يشوف الكل، ويقدر يحدد أي شركة يضيف لها المستخدم، أو يضيف سوبر أدمن جديد.
 * كل مستخدم (غير السوبر أدمن) ممكن يكون له تاريخ انتهاء صلاحية + تجديد بضغطة زر.
 */
class UserController extends BaseController
{
    public function index()
    {
        $model = new UserModel();

        $users = $this->isSuperAdmin()
            ? $model->orderBy('created_at', 'DESC')->findAll()
            : $model->where('company_id', $this->currentCompanyId())->orderBy('created_at', 'DESC')->findAll();

        $companyModel = new CompanyModel();
        $companies = $this->isSuperAdmin() ? array_column($companyModel->findAll(), 'name', 'id') : [];

        return view('admin/users/index', compact('users', 'companies', 'model'));
    }

    public function create()
    {
        $companies = $this->isSuperAdmin() ? (new CompanyModel())->findAll() : [];
        return view('admin/users/form', ['user' => null, 'companies' => $companies]);
    }

    public function store()
    {
        $model = new UserModel();
        $data = $this->userData();

        if (! $this->isSuperAdmin()) {
            $data['company_id'] = $this->currentCompanyId();
            $data['is_super_admin'] = 0;
        }

        if (! $model->insert($data)) {
            return redirect()->back()->withInput()->with('errors', $model->errors());
        }

        $this->logActivity('create_user', "أضاف مستخدم جديد: {$data['name']} ({$data['email']})");

        return redirect()->to('/admin/users')->with('message', lang('App.saved_successfully'));
    }

    public function edit($id)
    {
        $model = new UserModel();
        $user = $this->isSuperAdmin()
            ? $model->find($id)
            : $model->where('company_id', $this->currentCompanyId())->find($id);

        if (! $user) return redirect()->to('/admin/users');

        $companies = $this->isSuperAdmin() ? (new CompanyModel())->findAll() : [];
        return view('admin/users/form', compact('user', 'companies'));
    }

    public function update($id)
    {
        $model = new UserModel();
        $data = $this->userData(false);

        if (! $this->isSuperAdmin()) {
            unset($data['company_id'], $data['is_super_admin']);
        }

        $model->update($id, $data);

        $this->logActivity('update_user', "عدّل بيانات المستخدم: {$data['name']}");

        return redirect()->to('/admin/users')->with('message', lang('App.saved_successfully'));
    }

    public function delete($id)
    {
        if ((int) $id === (int) session()->get('admin_user_id')) {
            return redirect()->to('/admin/users')->with('error', 'لا يمكنك حذف حسابك الحالي');
        }

        $model = new UserModel();
        if (! $this->isSuperAdmin()) {
            $user = $model->where('company_id', $this->currentCompanyId())->find($id);
            if (! $user) return redirect()->to('/admin/users');
        }

        $model->delete($id);
        $this->logActivity('delete_user', "حذف مستخدم رقم {$id}");
        return redirect()->to('/admin/users')->with('message', lang('App.deleted_successfully'));
    }

    /** تجديد صلاحية المستخدم بعدد أشهر معيّن (من فورم صغير بجانب كل مستخدم) */
    public function renew($id)
    {
        $model = new UserModel();

        if (! $this->isSuperAdmin()) {
            $user = $model->where('company_id', $this->currentCompanyId())->find($id);
            if (! $user) return redirect()->to('/admin/users');
        }

        $months = (int) $this->request->getPost('renew_months');
        $months = $months > 0 ? $months : 1;

        $model->renew((int) $id, $months);
        $this->logActivity('renew_user', "جدّد اشتراك مستخدم رقم {$id} لمدة {$months} شهر");

        return redirect()->to('/admin/users')->with('message', "تم تجديد الحساب لمدة {$months} شهر بنجاح");
    }

    private function userData(bool $requirePassword = true): array
    {
        $data = [
            'name' => $this->request->getPost('name'),
            'email' => $this->request->getPost('email'),
            'preferred_locale' => $this->request->getPost('preferred_locale') ?: 'ar',
            'company_id' => $this->request->getPost('company_id') ?: null,
            'is_super_admin' => $this->request->getPost('is_super_admin') ? 1 : 0,
            'expires_at' => $this->request->getPost('expires_at') ?: null,
        ];

        $password = $this->request->getPost('password');
        if ($password) {
            $data['password'] = password_hash($password, PASSWORD_BCRYPT);
        }

        return $data;
    }
}
