<?php

declare(strict_types=1);

namespace App\Controllers;

use App\Core\Controller;
use App\Core\Request;
use App\Core\Session;
use App\Services\FournisseurService;

final class FournisseurController extends Controller
{
    public function index(): void
    {
        $service = new FournisseurService();
        $status = (string) Request::get('status', 'active');
        $status = in_array($status, ['active', 'archived', 'all'], true) ? $status : 'active';
        $fournisseurs = $service->listWithStats($status);

        $this->view('fournisseurs/index', [
            'title' => 'Fournisseurs',
            'fournisseurs' => $fournisseurs,
            'totalFournisseurs' => count($fournisseurs),
            'status' => $status,
        ]);
    }

    public function create(): void
    {
        $data = (new FournisseurService())->formData();

        $this->view('fournisseurs/form', [
            'title' => 'Nouveau fournisseur',
            'fournisseur' => $data['fournisseur'],
            'errors' => [],
            'mode' => 'create',
        ]);
    }

    public function store(): void
    {
        $service = new FournisseurService();
        $data = Request::all();
        $validator = $service->validator($data);

        if (!$validator->passes()) {
            $form = $service->formData();
            $this->view('fournisseurs/form', [
                'title' => 'Nouveau fournisseur',
                'fournisseur' => $data + $form['fournisseur'],
                'errors' => $validator->errors(),
                'mode' => 'create',
            ]);
            return;
        }

        try {
            $id = $service->create($data);
            Session::flash('success', 'Fournisseur créé avec succès.');
            $this->redirect('fournisseurs_show&id=' . $id);
        } catch (\Throwable $exception) {
            Session::flash('error', $exception->getMessage());
            $this->redirect('fournisseurs');
        }
    }

    public function show(): void
    {
        try {
            $service = new FournisseurService();
            $data = $service->findWithStats((int) Request::get('id', 0));

            $this->view('fournisseurs/show', [
                'title' => 'Fiche fournisseur',
                'fournisseur' => $data['fournisseur'],
                'stats' => $data['stats'],
            ]);
        } catch (\Throwable $exception) {
            Session::flash('error', $exception->getMessage());
            $this->redirect('fournisseurs');
        }
    }

    public function edit(): void
    {
        try {
            $data = (new FournisseurService())->formData((int) Request::get('id', 0));

            $this->view('fournisseurs/form', [
                'title' => 'Modifier fournisseur',
                'fournisseur' => $data['fournisseur'],
                'errors' => [],
                'mode' => 'edit',
            ]);
        } catch (\Throwable $exception) {
            Session::flash('error', $exception->getMessage());
            $this->redirect('fournisseurs');
        }
    }

    public function update(): void
    {
        $service = new FournisseurService();
        $id = (int) Request::post('id', 0);
        $data = Request::all();
        $validator = $service->validator($data);

        if (!$validator->passes()) {
            try {
                $form = $service->formData($id);
            } catch (\Throwable $exception) {
                Session::flash('error', $exception->getMessage());
                $this->redirect('fournisseurs');
            }

            $this->view('fournisseurs/form', [
                'title' => 'Modifier fournisseur',
                'fournisseur' => $data + $form['fournisseur'],
                'errors' => $validator->errors(),
                'mode' => 'edit',
            ]);
            return;
        }

        try {
            $service->update($id, $data);
            Session::flash('success', 'Fournisseur modifié avec succès.');
            $this->redirect('fournisseurs_show&id=' . $id);
        } catch (\Throwable $exception) {
            Session::flash('error', $exception->getMessage());
            $this->redirect('fournisseurs');
        }
    }

    public function deactivate(): void
    {
        try {
            (new FournisseurService())->deactivate((int) Request::post('id', 0));
            Session::flash('success', 'Fournisseur archivé.');
        } catch (\Throwable $exception) {
            Session::flash('error', $exception->getMessage());
        }

        $this->redirect('fournisseurs');
    }

    public function activate(): void
    {
        try {
            (new FournisseurService())->activate((int) Request::post('id', 0));
            Session::flash('success', 'Fournisseur réactivé.');
        } catch (\Throwable $exception) {
            Session::flash('error', $exception->getMessage());
        }

        $this->redirect('fournisseurs&status=archived');
    }
}
