<?php

namespace App\Http\Controllers;

use App\Models\Section;
use App\Models\Project;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;

class SectionController extends Controller
{
    public function index()
    {
        $sections = Section::with('project')->latest()->paginate(10);
        return view('sections.index', compact('sections'));
    }

    public function create()
    {
        // Clave: cargar imagen del proyecto para mandar data-image en el <option>
        $projects = Project::with('image')->orderBy('name')->get();
        return view('sections.create', compact('projects'));
    }

     public function public(Section $section)
    {
        // Eager-load para evitar N+1. Ajusta relaciones según tu modelo.
        $section->load([
            'project',
            'fractionals' => function ($q) {
                $q->with(['properties']); // opcional, por si muestras más info
            }
        ]);

        // Mapea estado → clase CSS
        $statusClasses = [
            'available'   => 'poly--available',
            'reserved'    => 'poly--reserved',
            'sold'        => 'poly--sold',
            'unavailable' => 'poly--unavailable',
        ];

        return view('sections.public', [
            'section'       => $section,
            'project'       => $section->project,
            'fractionals'   => $section->fractionals,
            'statusClasses' => $statusClasses,
        ]);
    }

    public function store(Request $request)
    {
        $data = $request->validate([
            'project_id'  => ['required','exists:projects,id'],
            'code'        => ['required','string','max:255'],
            'description' => ['nullable','string'],
            'image'       => ['nullable','image','max:4096'],
            'svg_points'  => ['nullable','string'],
        ]);

        // (Opcional) Evitar duplicados de código por proyecto
        if (Section::where('project_id', $data['project_id'])->where('code', $data['code'])->exists()) {
            return back()->withErrors(['code' => 'Ya existe una sección con ese código en este proyecto.'])->withInput();
        }

        if ($request->hasFile('image')) {
            $data['image'] = $request->file('image')->store('sections', 'public');
        }

        if (!empty($data['svg_points'])) {
            $decoded = json_decode($data['svg_points'], true);
            $data['svg_points'] = $decoded ?: null;
        }

        Section::create($data);

        return redirect()->route('sections.index')->with('status', 'Sección creada con éxito ✅');
    }

    public function edit(Section $section)
    {
        // Clave: cargar imagen del proyecto
        $projects = Project::with('image')->orderBy('name')->get();

        // Usa accessor $project->image_url si lo agregaste; si no, calcula aquí:
        $projectImageUrl = $this->projectImageUrl($section->project);

        // Pásala como fondo del canvas
        $backgroundImage = $projectImageUrl;

        return view('sections.edit', compact('section','projects','backgroundImage'));
    }

    public function update(Request $request, Section $section)
{
    $data = $request->validate([
        'project_id'  => ['required','exists:projects,id'],
        'code'        => ['required','string','max:255'],
        'description' => ['nullable','string'],
        'image'       => ['nullable','image','max:4096'],
        'svg_points'  => ['nullable','string'],
    ]);

    $exists = Section::where('project_id', $data['project_id'])
        ->where('code', $data['code'])
        ->where('id', '!=', $section->id)
        ->exists();
    if ($exists) {
        return back()->withErrors(['code' => 'Ya existe una sección con ese código en este proyecto.'])->withInput();
    }

    if ($request->hasFile('image')) {
        if ($section->image) Storage::disk('public')->delete($section->image);
        $data['image'] = $request->file('image')->store('sections', 'public');
    } else {
        $data['image'] = $section->image;
    }

    // 🔧 Igual que en store(): normaliza si viene algo
    if (!empty($data['svg_points'])) {
        $data['svg_points'] = $this->normalizePoints($data['svg_points']);
    } else {
        // si quieres conservar lo anterior cuando el textarea venga vacío, comenta esta línea:
        $data['svg_points'] = null;
    }

    $section->update($data);

    return redirect()->route('sections.index')->with('status', 'Sección actualizada ✅');
}


    public function destroy(Section $section)
    {
        if ($section->image) {
            Storage::disk('public')->delete($section->image);
        }
        $section->delete();

        return redirect()->route('sections.index')->with('status', 'Sección eliminada 🗑️');
    }

    /**
     * Obtiene la URL pública de la imagen del proyecto.
     * Ajusta los campos según tu modelo Image/Project.
     */
    private function projectImageUrl(?Project $project): ?string
    {
        if (!$project) return null;

        // Si agregaste el accessor getImageUrlAttribute() en Project:
        if (isset($project->image_url) && $project->image_url) {
            return $project->image_url;
        }

        // Fallback común si tu relación Image tiene un campo 'path'
        if ($project->image && !empty($project->image->path)) {
            return asset('storage/'.$project->image->path);
        }

        // Otro fallback si usas company_logo como archivo subido
        if (!empty($project->company_logo)) {
            return asset('storage/'.$project->company_logo);
        }

        
        return null;
    }

    private function normalizePoints(string $raw): string
{
    $s = trim($raw);

    // ¿Parece JSON?
    if ($s !== '' && ($s[0] === '[' || str_starts_with($s, '{'))) {
        try {
            $arr = json_decode($s, true, 512, JSON_THROW_ON_ERROR);
            $pairs = [];
            foreach ((array)$arr as $pt) {
                if (is_array($pt)) {
                    if (array_is_list($pt) && count($pt) >= 2) {
                        $pairs[] = ((float)$pt[0]).','.((float)$pt[1]);
                    } elseif (isset($pt['x'], $pt['y'])) {
                        $pairs[] = ((float)$pt['x']).','.((float)$pt['y']);
                    }
                }
            }
            if ($pairs) return implode(' ', $pairs);
        } catch (\Throwable $e) {
            // si falla, seguimos con limpieza de string
        }
    }

    // Limpieza para strings ya en formato "x,y x,y ..."
    $s = str_replace(["\r","\n","\t",";"], ' ', $s);
    $s = preg_replace('/\s+/', ' ', $s);
    return trim($s);
}
}
