<?php

namespace App\Http\Controllers\Public;

use App\Http\Controllers\Controller;
use App\Models\Quote;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;

class HomeController extends Controller
{
    public function index()
    {
        return view('public.home');
    }

    public function quote()
    {
        return view('public.orcamento');
    }

    public function storeQuote(Request $request)
    {
        $validated = $request->validate([
            'name'                 => 'required|string|max:255',
            'email'                => 'nullable|email|max:255',
            'phone'                => 'required|string|max:30',
            'address'              => 'nullable|string|max:255',
            'property_type'        => 'nullable|string|in:residential,commercial,industrial',
            'cctv_count'           => 'nullable|integer|min:0|max:500',
            'services'             => 'nullable|array',
            'services.*'           => 'string|in:cctv,alarme,acesso,monitorizacao',
            'service_type'         => 'nullable|string|max:100',
            'details'              => 'nullable|string|max:1500',
        ]);

        $services = $this->selectedServices($validated);
        $details = $this->formatQuoteDetails($validated, $services);

        $quote = Quote::create([
            'name'         => $validated['name'],
            'phone'        => $validated['phone'],
            'email'        => $validated['email'] ?? null,
            'service_type' => $services ? implode(', ', $services) : ($validated['service_type'] ?? 'Pedido geral'),
            'details'      => $details,
            'status'       => 'new',
        ]);

        if ($request->has('full_quote')) {
            return redirect()
                ->route('quote.create')
                ->with('quote_success', 'O seu pedido foi enviado com sucesso. Um consultor entrará em contacto em até 24 horas úteis.')
                ->with('quote_payload', [
                    'id' => $quote->id,
                    'name' => $quote->name,
                    'email' => $quote->email,
                    'phone' => $quote->phone,
                    'address' => $validated['address'] ?? null,
                    'property_type' => $validated['property_type'] ?? null,
                    'services' => $services,
                    'cctv_count' => $validated['cctv_count'] ?? null,
                    'notes' => $validated['details'] ?? null,
                ]);
        }

        return redirect()->route('home')->with('quote_success', 'O seu pedido foi enviado com sucesso! Entraremos em contacto em breve.');
    }

    public function downloadQuote(Quote $quote)
    {
        $content = implode(PHP_EOL, [
            'SecureVision - Resumo do Pedido de Orçamento',
            'Referência: #' . $quote->id,
            'Nome: ' . $quote->name,
            'Email: ' . ($quote->email ?: 'Não informado'),
            'Telefone: ' . $quote->phone,
            'Serviços: ' . ($quote->service_type ?: 'Pedido geral'),
            '',
            'Detalhes:',
            $quote->details ?: 'Sem detalhes adicionais.',
            '',
            'Gerado em: ' . now()->format('d/m/Y H:i'),
        ]);

        return response($content, 200, [
            'Content-Type' => 'text/plain; charset=UTF-8',
            'Content-Disposition' => 'attachment; filename="orcamento-securevision-' . $quote->id . '.txt"',
        ]);
    }

    private function selectedServices(array $validated): array
    {
        $labels = [
            'cctv' => 'CCTV e vídeo vigilância',
            'alarme' => 'Alarmes inteligentes',
            'acesso' => 'Controle de acesso',
            'monitorizacao' => 'Monitoramento 24h',
        ];

        if (! empty($validated['services'])) {
            return collect($validated['services'])
                ->map(fn ($service) => $labels[$service] ?? $service)
                ->values()
                ->all();
        }

        if (! empty($validated['service_type'])) {
            return [Arr::get($labels, $validated['service_type'], $validated['service_type'])];
        }

        return [];
    }

    private function formatQuoteDetails(array $validated, array $services): string
    {
        $propertyTypes = [
            'residential' => 'Residencial',
            'commercial' => 'Comercial',
            'industrial' => 'Industrial',
        ];

        return collect([
            'Morada do local: ' . ($validated['address'] ?? 'Não informada'),
            'Tipo de imóvel: ' . ($propertyTypes[$validated['property_type'] ?? ''] ?? 'Não informado'),
            'Quantidade estimada de câmeras: ' . ($validated['cctv_count'] ?? 'Não informada'),
            'Serviços pretendidos: ' . ($services ? implode(', ', $services) : 'Não especificado'),
            'Observações: ' . ($validated['details'] ?? 'Sem observações'),
        ])->implode(PHP_EOL);
    }
}
