<?php

namespace App\Http\Controllers\Master;

use App\Http\Controllers\Controller;
use App\Services\BrandingService;
use App\Support\SiteSettings;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
use Illuminate\View\View;

class ConfiguracaoController extends Controller
{
    public function edit(SiteSettings $site): View
    {
        return view('master.configuracoes', [
            'config' => $site->todos(),
            'paleta' => $site->paleta(),
        ]);
    }

    public function update(Request $request, SiteSettings $site, BrandingService $branding): RedirectResponse
    {
        $dados = $request->validate([
            'site_nome' => ['required', 'string', 'max:60'],
            'site_descricao' => ['nullable', 'string', 'max:120'],
            'cor_primaria' => ['required', 'string', 'regex:/^#[0-9a-fA-F]{6}$/'],

            'login_titulo' => ['required', 'string', 'max:160'],
            'login_subtitulo' => ['nullable', 'string', 'max:400'],
            'login_destaques' => ['nullable', 'string', 'max:800'],
            'login_permitir_cadastro' => ['boolean'],

            'dev_nome' => ['nullable', 'string', 'max:80'],
            'dev_site' => ['nullable', 'url', 'max:180'],
            'dev_email' => ['nullable', 'email', 'max:180'],
            'dev_telefone' => ['nullable', 'string', 'max:30'],
            'dev_creditos' => ['nullable', 'string', 'max:200'],

            'suporte_email' => ['nullable', 'email', 'max:180'],
            'suporte_telefone' => ['nullable', 'string', 'max:30'],
            'suporte_whatsapp' => ['nullable', 'string', 'max:30'],

            'logo' => ['nullable', 'image', 'mimes:png,jpg,jpeg,webp,svg', 'max:1024'],
            'logo_claro' => ['nullable', 'image', 'mimes:png,jpg,jpeg,webp,svg', 'max:1024'],
            'favicon' => ['nullable', 'image', 'mimes:png,ico,svg', 'max:256'],
        ], [
            'cor_primaria.regex' => 'Informe a cor no formato hexadecimal, por exemplo #215a68.',
            'logo.max' => 'A logo deve ter no máximo 1 MB.',
            'favicon.max' => 'O favicon deve ter no máximo 256 KB.',
        ], [
            'site_nome' => 'nome do sistema',
            'cor_primaria' => 'cor primária',
            'login_titulo' => 'título da tela de login',
            'dev_nome' => 'nome do desenvolvedor',
        ]);

        $site->salvar([
            ...collect($dados)->except(['logo', 'logo_claro', 'favicon'])->all(),
            'cor_primaria' => strtolower($dados['cor_primaria']),
            'login_permitir_cadastro' => $request->boolean('login_permitir_cadastro') ? '1' : '0',
        ]);

        foreach (['logo' => 'logo_path', 'logo_claro' => 'logo_claro_path', 'favicon' => 'favicon_path'] as $input => $campo) {
            if ($request->hasFile($input)) {
                $branding->guardar($campo, $request->file($input));
            }
        }

        return back()->with('status', 'Configurações do site salvas.');
    }

    public function removerImagem(Request $request, BrandingService $branding): RedirectResponse
    {
        $campo = $request->validate([
            'campo' => ['required', Rule::in(BrandingService::CAMPOS)],
        ])['campo'];

        $branding->remover($campo);

        return back()->with('status', 'Imagem removida.');
    }

    /** Restaura os valores de fábrica, preservando as imagens enviadas. */
    public function restaurar(SiteSettings $site): RedirectResponse
    {
        $site->salvar(
            collect(SiteSettings::padroes())
                ->except(BrandingService::CAMPOS)
                ->all()
        );

        return back()->with('status', 'Configurações restauradas para o padrão.');
    }
}
