<?php
declare(strict_types=1);
namespace App\Controllers;

use App\Core\Controller;
use App\Core\SessionAuth;
use App\Repositories\CategoryRepository;
use App\Services\AuditService;

final class CategoriesController extends Controller {
    public function index(): void {
        app()->get(SessionAuth::class)->requirePageAccess('categories');
        $repo = new CategoryRepository();
        $rows = $repo->allWithCounts();
        $activeCategories = $repo->active();
        $this->view('categories/index', compact('rows', 'activeCategories'));
    }

    public function store(): void {
        app()->get(SessionAuth::class)->requirePageAccess('categories');
        verify_csrf();
        $nameAr = trim((string)($_POST['name_ar'] ?? ''));
        if ($nameAr === '') {
            flash('error', 'يرجى إدخال اسم الفئة');
            redirect(base_url('?page=categories'));
        }
        $repo = new CategoryRepository();
        $id = $repo->create([
            'name_ar' => $nameAr,
            'name_en' => trim((string)($_POST['name_en'] ?? '')),
            'sort_order' => (int)($_POST['sort_order'] ?? 0),
        ]);
        (new AuditService())->log('categories', 'create', $id, ['name_ar' => $nameAr]);
        flash('success', 'تمت إضافة الفئة بنجاح');
        redirect(base_url('?page=categories'));
    }

    public function update(): void {
        app()->get(SessionAuth::class)->requirePageAccess('categories');
        verify_csrf();
        $id = (int)($_POST['id'] ?? 0);
        if ($id <= 0) {
            flash('error', 'الفئة غير صالحة');
            redirect(base_url('?page=categories'));
        }
        $nameAr = trim((string)($_POST['name_ar'] ?? ''));
        if ($nameAr === '') {
            flash('error', 'يرجى إدخال اسم الفئة');
            redirect(base_url('?page=categories'));
        }
        $repo = new CategoryRepository();
        $repo->updateCategory($id, [
            'name_ar' => $nameAr,
            'name_en' => trim((string)($_POST['name_en'] ?? '')),
            'sort_order' => (int)($_POST['sort_order'] ?? 0),
        ]);
        (new AuditService())->log('categories', 'update', $id, ['name_ar' => $nameAr]);
        flash('success', 'تم تحديث الفئة بنجاح');
        redirect(base_url('?page=categories'));
    }

    public function moveItems(): void {
        app()->get(SessionAuth::class)->requirePageAccess('categories');
        verify_csrf();
        $from = (int)($_POST['from_category_id'] ?? 0);
        $to = (int)($_POST['to_category_id'] ?? 0);
        if ($from <= 0 || $to <= 0 || $from === $to) {
            flash('error', 'بيانات النقل غير صالحة');
            redirect(base_url('?page=categories'));
        }
        $repo = new CategoryRepository();
        $moved = $repo->moveItems($from, $to);
        (new AuditService())->log('categories', 'move_items', $from, ['to_category_id' => $to, 'moved' => $moved]);
        flash('success', 'تم نقل القطع إلى الفئة الجديدة بنجاح');
        redirect(base_url('?page=categories'));
    }

    public function delete(): void {
        app()->get(SessionAuth::class)->requirePageAccess('categories');
        verify_csrf();
        $id = (int)($_POST['id'] ?? 0);
        if ($id <= 0) {
            flash('error', 'الفئة غير صالحة');
            redirect(base_url('?page=categories'));
        }
        $repo = new CategoryRepository();
        if (!$repo->deactivateIfEmpty($id)) {
            flash('error', 'لا يمكن حذف الفئة قبل نقل جميع القطع المرتبطة بها إلى فئة أخرى');
            redirect(base_url('?page=categories'));
        }
        (new AuditService())->log('categories', 'delete', $id, []);
        flash('success', 'تم حذف الفئة بنجاح');
        redirect(base_url('?page=categories'));
    }
}
