<?php

namespace App\Http\Controllers\Web;

use App\Http\Controllers\Controller;
use App\Models\LetterHeadTemplate;
use App\Services\AuditService;
use App\Support\FormTextRules;
use Illuminate\Http\Request;

class LetterHeadTemplateController extends Controller
{
    public function __construct(
        protected AuditService $audit
    ) {}

    public function index()
    {
        $templates = LetterHeadTemplate::orderBy('name')->paginate(15);

        return view('letter-head-templates.index', compact('templates'));
    }

    public function create()
    {
        return view('letter-head-templates.create');
    }

    public function store(Request $request)
    {
        $validated = $request->validate($this->rules(), FormTextRules::messages());
        $validated['company_id'] = auth()->user()->company_id;

        $template = LetterHeadTemplate::create($validated);
        $this->audit->log('letter_head_template.created', $template);

        return redirect()->route('letter-head-templates.index')->with('success', 'Template created successfully.');
    }

    public function edit(LetterHeadTemplate $letterHeadTemplate)
    {
        $this->assertTenantRecord($letterHeadTemplate);

        return view('letter-head-templates.edit', compact('letterHeadTemplate'));
    }

    public function update(Request $request, LetterHeadTemplate $letterHeadTemplate)
    {
        $this->assertTenantRecord($letterHeadTemplate);

        $validated = $request->validate($this->rules(), FormTextRules::messages());
        $letterHeadTemplate->update($validated);
        $this->audit->log('letter_head_template.updated', $letterHeadTemplate);

        return redirect()->route('letter-head-templates.index')->with('success', 'Template updated successfully.');
    }

    public function preview(LetterHeadTemplate $letterHeadTemplate)
    {
        $this->assertTenantRecord($letterHeadTemplate);

        return view('letter-head-templates.preview', [
            'template' => $letterHeadTemplate,
            'company' => auth()->user()?->company,
        ]);
    }

    public function downloadPdf(LetterHeadTemplate $letterHeadTemplate)
    {
        $this->assertTenantRecord($letterHeadTemplate);

        if (! class_exists(\Barryvdh\DomPDF\Facade\Pdf::class)) {
            return redirect()->route('letter-head-templates.preview', $letterHeadTemplate)
                ->with('error', 'PDF download requires barryvdh/laravel-dompdf. Use browser print from preview.');
        }

        $pdf = \Barryvdh\DomPDF\Facade\Pdf::loadView('letter-head-templates.preview-pdf', [
            'template' => $letterHeadTemplate,
            'company' => auth()->user()?->company,
        ]);

        $this->audit->log('letter_head_template.pdf', $letterHeadTemplate);

        return $pdf->download('letterhead-' . $letterHeadTemplate->id . '.pdf');
    }

    public function destroy(LetterHeadTemplate $letterHeadTemplate)
    {
        $this->assertTenantRecord($letterHeadTemplate);
        $letterHeadTemplate->delete();
        $this->audit->log('letter_head_template.deleted', null, ['template_id' => $letterHeadTemplate->id]);

        return redirect()->route('letter-head-templates.index')->with('success', 'Template deleted.');
    }

    /**
     * @return array<string, mixed>
     */
    protected function rules(): array
    {
        return [
            'name' => FormTextRules::notNumericOnly(true, 191),
            'content' => FormTextRules::notNumericOnlyHtml(false, 50000),
            'header_html' => FormTextRules::notNumericOnlyHtml(false, 2000),
            'footer_html' => FormTextRules::notNumericOnlyHtml(false, 2000),
        ];
    }

    protected function assertTenantRecord(LetterHeadTemplate $letterHeadTemplate): void
    {
        $companyId = auth()->user()?->company_id;
        if ($companyId && (int) $letterHeadTemplate->company_id !== (int) $companyId) {
            abort(403);
        }
    }
}
