<?php

declare(strict_types=1);

namespace ABS\Modules\QuickAccess\Controllers;

use ABS\Core\Controller;
use ABS\Modules\QuickAccess\Repositories\QuickAccessRepository;
use RuntimeException;
use Throwable;

final class QuickAccessController extends Controller
{
    private QuickAccessRepository $repo;
    public function __construct(){ $this->repo=new QuickAccessRepository();$this->repo->ensureSchema(); }
    private function uid():int{return (int)($_SESSION['user']['id']??$_SESSION['user_id']??0);}

    public function index(): never
    {
        $this->view('quick_access/index',[
            'title'=>'Linkuri rapide',
            'links'=>$this->repo->links($_GET),
            'categories'=>$this->repo->categories(false),
        ]);
    }
    public function summary(): never { $this->json(['ok'=>true,'summary'=>$this->repo->summary()]); }
    public function open(string $id): never
    {
        $link=$this->repo->find((int)$id); if(!$link || !(int)$link['active']){http_response_code(404);exit('Link inexistent sau inactiv.');}
        $this->repo->recordUsage((int)$id,$this->uid()); header('Location: '.$link['url']); exit;
    }
    public function store(): never
    {
        try{$data=$_POST;$data['logo_path']=$this->saveLogo()?:trim((string)($_POST['logo_path']??''));$id=$this->repo->save($data,$this->uid());$this->json(['ok'=>true,'id'=>$id,'message'=>'Link adăugat.']);}
        catch(Throwable $e){$this->error($e->getMessage(),422);}
    }
    public function update(string $id): never
    {
        try{$old=$this->repo->find((int)$id);if(!$old)throw new RuntimeException('Link inexistent.');$data=$_POST;$data['logo_path']=$this->saveLogo()?:($old['logo_path']??'');$this->repo->save($data,$this->uid(),(int)$id);$this->json(['ok'=>true,'message'=>'Link actualizat.']);}
        catch(Throwable $e){$this->error($e->getMessage(),422);}
    }
    public function delete(string $id): never { try{$this->repo->delete((int)$id);$this->json(['ok'=>true]);}catch(Throwable $e){$this->error($e->getMessage(),422);} }
    public function favorite(string $id): never { try{$this->json(['ok'=>true,'favorite'=>$this->repo->favorite((int)$id)]);}catch(Throwable $e){$this->error($e->getMessage(),422);} }
    public function reorder(): never
    {
        try{$ids=json_decode((string)($_POST['ids']??'[]'),true);if(!is_array($ids))throw new RuntimeException('Ordine invalidă.');$this->repo->reorder($ids);$this->json(['ok'=>true]);}
        catch(Throwable $e){$this->error($e->getMessage(),422);}
    }
    public function importSuppliers(): never
    {
        try{$count=$this->repo->importSuppliers($this->uid());$this->json(['ok'=>true,'count'=>$count,'message'=>$count.' linkuri importate.']);}
        catch(Throwable $e){$this->error($e->getMessage(),422);}
    }
    private function saveLogo(): ?string
    {
        if(empty($_FILES['logo']['tmp_name']) || !is_uploaded_file($_FILES['logo']['tmp_name']))return null;
        if((int)$_FILES['logo']['size']>5*1024*1024)throw new RuntimeException('Logo-ul nu poate depăși 5 MB.');
        $mime=(new \finfo(FILEINFO_MIME_TYPE))->file($_FILES['logo']['tmp_name']);$ext=['image/jpeg'=>'jpg','image/png'=>'png','image/webp'=>'webp','image/svg+xml'=>'svg'][$mime]??null;
        if(!$ext)throw new RuntimeException('Logo invalid. Sunt acceptate JPG, PNG, WEBP și SVG.');
        $root=dirname(__DIR__,3);$dir=$root.'/public/uploads/quick_access';if(!is_dir($dir)&&!mkdir($dir,0775,true)&&!is_dir($dir))throw new RuntimeException('Directorul pentru logo-uri nu poate fi creat.');
        $name='quick_'.bin2hex(random_bytes(8)).'.'.$ext;if(!move_uploaded_file($_FILES['logo']['tmp_name'],$dir.'/'.$name))throw new RuntimeException('Logo-ul nu a putut fi salvat.');
        return '/uploads/quick_access/'.$name;
    }
    private function error(string $message,int $status): never { http_response_code($status);$this->json(['ok'=>false,'message'=>$message]); }
}
