<?php

namespace App\Controllers\Location;

use App\Controllers\BaseController;
use App\Models\Location\LocationPhotosModel;
use CodeIgniter\HTTP\Response;
use CodeIgniter\API\ResponseTrait;


$allowedOrigins = [
    // 'https://catchef.bravecatstudios.com',  // Producción
    'http://localhost:4200', // Desarrollo en local
    'http://localhost:8080', // Desarrollo en local Mac Cambios que hicimos
];

if (isset($_SERVER['HTTP_ORIGIN']) && in_array($_SERVER['HTTP_ORIGIN'], $allowedOrigins)) {
    header('Access-Control-Allow-Origin: ' . $_SERVER['HTTP_ORIGIN']);
}

header('Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE');
header('Access-Control-Allow-Headers: Content-Type, Authorization');
header('Access-Control-Allow-Credentials: true');

class LocationPhotosController extends BaseController
{
    protected $locationPhotosModel;
    use ResponseTrait;

    public function __construct(){
        $this->locationPhotosModel = new LocationPhotosModel();
    }

    public function options()
    {
        return $this->respond('', 204);
    }

    public function getFotosPorUbicacion($locationId)
    {
        // Carga el modelo de fotos (asegúrate de tenerlo creado)
        $fotoModel = new \App\Models\Location\LocationPhotosModel();

        // Obtiene todas las fotos que pertenecen a esa ubicación
        $fotos = $fotoModel->where('FK_Location', $locationId)->findAll();

        // Puedes enviar solo las rutas, o más info si quieres
        $path = array_map(function($foto) {
            return base_url($foto['ImagePath']); // Genera URL completa
        }, $fotos);

        // Responde con JSON
        return $this->response->setJSON([
            'status' => 'success',
            'locationId' => $locationId,
            'images' => $path
        ]);
    }



    public function subirFotosUbicacion($locationId)
    {
        $locationId = (int) $locationId;
        $files = $this->request->getFiles();

        if (!$locationId) {
            return $this->response->setJSON([
                'status' => 'error',
                'message' => 'locationId inválido'
            ])->setStatusCode(400);
        }

        if (!isset($files['foto']) || !is_array($files['foto']) || !count($files['foto'])) {
            return $this->response->setJSON([
                'status' => 'error',
                'message' => 'No se recibieron archivos (foto[]).'
            ])->setStatusCode(400);
        }

        $dir = FCPATH . 'uploads/locations/' . $locationId . '/';
        if (!is_dir($dir)) {
            mkdir($dir, 0755, true);
        }

        foreach ($files['foto'] as $file) {
            if ($file->isValid() && !$file->hasMoved()) {
                $newName = $file->getRandomName();
                $file->move($dir, $newName);

                $relativePath = 'uploads/locations/' . $locationId . '/' . $newName;

                // INSERT en BD (asegúrate de que los campos coincidan con tu tabla)
                $this->locationPhotosModel->insert([
                    'FK_Location' => $locationId,
                    'ImagePath'   => $relativePath,
                    // 'CreatedAt' => date('Y-m-d H:i:s'), // si tienes columna
                ]);
            }
        }

        return $this->response->setJSON(['status' => 'success']);
    }


    public function deleteFoto($locationId)
    {
        $locationId = (int) $locationId;
        $body = $this->request->getJSON(true);
        $imageUrl = $body['imageUrl'] ?? null;

        if (!$imageUrl) {
            return $this->respond([
                'status'  => 'error',
                'message' => 'Falta "imageUrl" en el body.',
            ], 400);
        }

        // Normaliza a ruta relativa (soporta URL absoluta o ya relativa)
        $relativePath = $imageUrl;

        // Si viene absoluta, extrae lo que sigue de "/uploads/"
        $pos = strpos($imageUrl, '/uploads/');
        if ($pos !== false) {
            $relativePath = ltrim(substr($imageUrl, $pos + 1), '/'); // quita el primer "/"
        } else {
            // Si no se encontró "/uploads/", intenta con parse_url y limpia
            $path = parse_url($imageUrl, PHP_URL_PATH) ?: '';
            $path = ltrim($path, '/');
            $pos2 = strpos($path, 'uploads/');
            if ($pos2 !== false) {
                $relativePath = substr($path, $pos2);
            } else {
                // si ya es relativo, se queda tal cual
                $relativePath = $path ?: $imageUrl;
            }
        }

        // Busca el registro
        $row = $this->locationPhotosModel
            ->where('FK_Location', $locationId)
            ->where('ImagePath', $relativePath)
            ->first();

        if (!$row) {
            return $this->respond([
                'status'  => 'error',
                'message' => 'Imagen no encontrada para esta propiedad.',
            ], 404);
        }

        // Borra archivo físico si existe
        $absPath = FCPATH . $relativePath;
        if (is_file($absPath)) {
            @unlink($absPath);
        }

        // Borra de BD
        $this->locationPhotosModel->delete($row['PK_Image']);

        return $this->respond([
            'status'  => 'success',
            'message' => 'Imagen eliminada.',
        ]);
    }



    public function deleteAllFotos($locationId)
    {
        $locationId = (int) $locationId;

        $fotos = $this->locationPhotosModel
            ->where('FK_Location', $locationId)
            ->findAll();

        foreach ($fotos as $foto) {
            $absPath = FCPATH . $foto['ImagePath'];
            if (is_file($absPath)) {
                @unlink($absPath);
            }
            $this->locationPhotosModel->delete($foto['PK_Image']);
        }

        // Opcional: eliminar carpeta si está vacía
        $dir = FCPATH . 'uploads/locations/' . $locationId . '/';
        if (is_dir($dir)) {
            @rmdir($dir); // sólo elimina si está vacía
        }

        return $this->respond([
            'status'  => 'success',
            'message' => 'Todas las imágenes fueron eliminadas.',
        ]);
    }


}