<?php

declare(strict_types=1);

require_once __DIR__ . '/../models/Categoria.php';

class ServicoController extends Controller
{
    public function index(): void
    {
        Auth::requireLogin();

        $model = new Categoria();
        $servicos = $model->todas();

        $this->view('servicos/index', compact('servicos'), 'admin');
    }

    public function create(): void
    {
        Auth::requireLogin();

        $servico = [
            'id' => null,
            'nome' => '',
            'icone' => '',
            'cor' => '#1351b4',
            'sla_dias' => 3,
            'ativo' => 1,
        ];
        $modo = 'create';

        $this->view('servicos/form', compact('servico', 'modo'), 'admin');
    }

    public function store(): void
    {
        Auth::requireLogin();

        $dados = $this->collectInput();
        $erros = $this->validate($dados);

        if (!empty($erros)) {
            Session::flash('erro', implode(' ', $erros));
            Session::set('servico_form_data', $dados);
            $this->redirect('/admin/servicos/create');
        }

        $model = new Categoria();
        $model->criar($dados);

        Session::flash('sucesso', 'Serviço cadastrado com sucesso.');
        $this->redirect('/admin/servicos');
    }

    public function edit(): void
    {
        Auth::requireLogin();

        $id = (int) ($_GET['id'] ?? 0);
        if ($id <= 0) {
            Session::flash('erro', 'Serviço não informado.');
            $this->redirect('/admin/servicos');
        }

        $model = new Categoria();
        $servico = $model->buscarPorId($id);

        if (!$servico) {
            Session::flash('erro', 'Serviço não encontrado.');
            $this->redirect('/admin/servicos');
        }

        $modo = 'edit';
        $this->view('servicos/form', compact('servico', 'modo'), 'admin');
    }

    public function update(): void
    {
        Auth::requireLogin();

        $id = (int) ($_POST['id'] ?? 0);
        if ($id <= 0) {
            Session::flash('erro', 'Serviço não informado.');
            $this->redirect('/admin/servicos');
        }

        $dados = $this->collectInput();
        $erros = $this->validate($dados);

        if (!empty($erros)) {
            Session::flash('erro', implode(' ', $erros));
            $this->redirect('/admin/servicos/edit?id=' . $id);
        }

        $model = new Categoria();
        if (!$model->buscarPorId($id)) {
            Session::flash('erro', 'Serviço não encontrado.');
            $this->redirect('/admin/servicos');
        }

        $model->atualizar($id, $dados);

        Session::flash('sucesso', 'Serviço atualizado com sucesso.');
        $this->redirect('/admin/servicos');
    }

    private function collectInput(): array
    {
        return [
            'nome' => trim((string) ($_POST['nome'] ?? '')),
            'icone' => trim((string) ($_POST['icone'] ?? '')),
            'cor' => $this->normalizeColor((string) ($_POST['cor'] ?? '')),
            'sla_dias' => (int) ($_POST['sla_dias'] ?? 0),
            'ativo' => isset($_POST['ativo']) ? 1 : 0,
        ];
    }

    private function validate(array $dados): array
    {
        $erros = [];

        if ($dados['nome'] === '') {
            $erros[] = 'Informe o nome do serviço.';
        }

        if ($dados['sla_dias'] < 0 || $dados['sla_dias'] > 365) {
            $erros[] = 'O SLA deve estar entre 0 e 365 dias.';
        }

        if (!preg_match('/^#[0-9a-fA-F]{6}$/', $dados['cor'])) {
            $erros[] = 'Informe uma cor válida no formato hexadecimal.';
        }

        return $erros;
    }

    private function normalizeColor(string $color): string
    {
        $color = trim($color);
        if ($color === '') {
            return '#1351b4';
        }

        if ($color[0] !== '#') {
            $color = '#' . $color;
        }

        return strtoupper($color);
    }
}
