<?php
declare(strict_types=1);
session_start();
require __DIR__.'/config/database.php';
require __DIR__.'/helpers/response.php';
header('Access-Control-Allow-Origin: '.($_SERVER['HTTP_ORIGIN'] ?? '*'));
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Allow-Headers: Content-Type');
header('Access-Control-Allow-Methods: GET,POST,PUT,PATCH,DELETE,OPTIONS');
if($_SERVER['REQUEST_METHOD']==='OPTIONS'){http_response_code(204);exit;}
try{$pdo=(new Database())->connect();}catch(Throwable $e){jsonResponse(['ok'=>false,'mensaje'=>'No se pudo conectar a MySQL. Revisa api/config/database.php','detalle'=>$e->getMessage()],500);}
$path=trim($_GET['route']??'', '/');
$method=$_SERVER['REQUEST_METHOD'];
$data=bodyJson();

function productoCompleto(PDO $pdo, array $p): array {
  $st=$pdo->prepare('SELECT ruta_imagen FROM producto_imagenes WHERE producto_id=? ORDER BY es_principal DESC, orden ASC');$st->execute([$p['id']]);
  $imgs=array_column($st->fetchAll(),'ruta_imagen');
  $et=[]; if((int)$p['nuevo'])$et[]='nuevo'; if((int)$p['oferta'])$et[]='oferta'; if((int)$p['mas_vendido'])$et[]='mas-vendido';
  return ['id'=>$p['codigo'],'dbId'=>(int)$p['id'],'nombre'=>$p['nombre'],'marca'=>$p['marca'],'categoria'=>$p['categoria_slug'],'precio'=>(float)$p['precio'],'precioAnterior'=>$p['precio_anterior']!==null?(float)$p['precio_anterior']:null,'rating'=>(float)$p['rating'],'reseñas'=>(int)$p['resenas'],'stock'=>(int)$p['stock'],'etiquetas'=>$et,'tags'=>array_values(array_filter(array_map('trim',explode(',',(string)$p['tags'])))),'descripcion'=>$p['descripcion'],'imagenes'=>$imgs?:['assets/productos/placeholder.png'],'estado'=>$p['estado']];
}

if($path==='productos' && $method==='GET'){
 $sql='SELECT p.*,c.slug categoria_slug FROM productos p JOIN categorias c ON c.id=p.categoria_id WHERE p.estado="activo" ORDER BY p.id DESC';
 $rows=$pdo->query($sql)->fetchAll(); jsonResponse(array_map(fn($p)=>productoCompleto($pdo,$p),$rows));
}
if(preg_match('#^productos/([^/]+)$#',$path,$m) && $method==='GET'){
 $st=$pdo->prepare('SELECT p.*,c.slug categoria_slug FROM productos p JOIN categorias c ON c.id=p.categoria_id WHERE (p.codigo=? OR p.id=?) AND p.estado="activo"');$st->execute([$m[1],$m[1]]);$p=$st->fetch();
 if(!$p)jsonResponse(['ok'=>false,'mensaje'=>'Producto no encontrado'],404); jsonResponse(productoCompleto($pdo,$p));
}
if($path==='categorias' && $method==='GET'){
 jsonResponse($pdo->query('SELECT id,nombre,slug,descripcion,imagen,estado FROM categorias WHERE estado="activo" ORDER BY nombre')->fetchAll());
}
if($path==='auth/login' && $method==='POST'){
 $email=strtolower(trim($data['email']??''));$pass=$data['password']??'';
 $st=$pdo->prepare('SELECT id,nombre,email,password,rol,estado FROM usuarios WHERE email=? LIMIT 1');$st->execute([$email]);$u=$st->fetch();
 if(!$u||$u['estado']!=='activo'||!password_verify($pass,$u['password']))jsonResponse(['ok'=>false,'mensaje'=>'Correo o contraseña incorrectos.'],401);
 unset($u['password']);$_SESSION['novax_user']=$u;jsonResponse(['ok'=>true,'usuario'=>$u]);
}
if($path==='auth/logout' && $method==='POST'){session_destroy();jsonResponse(['ok'=>true]);}
if($path==='auth/me' && $method==='GET'){jsonResponse(['ok'=>true,'usuario'=>$_SESSION['novax_user']??null]);}
if($path==='auth/registro' && $method==='POST'){
 $nombre=trim($data['nombre']??'');$email=strtolower(trim($data['email']??''));$pass=$data['password']??'';
 if(!$nombre||!filter_var($email,FILTER_VALIDATE_EMAIL)||strlen($pass)<6)jsonResponse(['ok'=>false,'mensaje'=>'Completa datos válidos. La contraseña debe tener 6 caracteres.'],422);
 try{$st=$pdo->prepare('INSERT INTO usuarios(nombre,email,password,rol) VALUES(?,?,?,"cliente")');$st->execute([$nombre,$email,password_hash($pass,PASSWORD_DEFAULT)]);}catch(PDOException $e){jsonResponse(['ok'=>false,'mensaje'=>'Ese correo ya está registrado.'],409);}
 $_SESSION['novax_user']=['id'=>(int)$pdo->lastInsertId(),'nombre'=>$nombre,'email'=>$email,'rol'=>'cliente','estado'=>'activo'];jsonResponse(['ok'=>true,'usuario'=>$_SESSION['novax_user']],201);
}
if($path==='pedidos' && $method==='POST'){
 $items=$data['items']??[]; if(!$items)jsonResponse(['ok'=>false,'mensaje'=>'El carrito está vacío.'],422);
 $numero='NX-'.date('ymd').'-'.random_int(1000,9999);$pdo->beginTransaction();
 try{$st=$pdo->prepare('INSERT INTO pedidos(numero_pedido,usuario_id,nombre_cliente,email_cliente,telefono,ciudad,direccion,referencia,codigo_postal,subtotal,envio,total,metodo_pago,estado_pago,estado_pedido) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,"pendiente","confirmado")');
 $u=$_SESSION['novax_user']??null;$st->execute([$numero,$u['id']??null,$data['nombre'],$data['email'],$data['telefono'],$data['ciudad'],$data['direccion'],$data['referencia']??null,$data['codigo_postal'],$data['subtotal'],$data['envio'],$data['total'],$data['metodo_pago']]);$pid=(int)$pdo->lastInsertId();
 $det=$pdo->prepare('INSERT INTO pedido_detalles(pedido_id,producto_id,nombre_producto,cantidad,precio_unitario,subtotal) VALUES(?,?,?,?,?,?)');
 foreach($items as $it){$det->execute([$pid,$it['dbId']??null,$it['nombre'],$it['cantidad'],$it['precio'],$it['precio']*$it['cantidad']]);}
 $pdo->commit();jsonResponse(['ok'=>true,'numero_pedido'=>$numero],201);}catch(Throwable $e){$pdo->rollBack();jsonResponse(['ok'=>false,'mensaje'=>'No se pudo registrar el pedido.','detalle'=>$e->getMessage()],500);}
}

if(str_starts_with($path,'admin/')) requireAdmin();
if($path==='admin/resumen' && $method==='GET'){
 jsonResponse(['productos'=>(int)$pdo->query('SELECT COUNT(*) FROM productos')->fetchColumn(),'activos'=>(int)$pdo->query('SELECT COUNT(*) FROM productos WHERE estado="activo"')->fetchColumn(),'stock_bajo'=>(int)$pdo->query('SELECT COUNT(*) FROM productos WHERE stock<=5')->fetchColumn(),'pedidos'=>(int)$pdo->query('SELECT COUNT(*) FROM pedidos')->fetchColumn()]);
}
if($path==='admin/productos' && $method==='GET'){
 $rows=$pdo->query('SELECT p.*,c.nombre categoria_nombre,c.slug categoria_slug FROM productos p JOIN categorias c ON c.id=p.categoria_id ORDER BY p.id DESC')->fetchAll();jsonResponse(array_map(fn($p)=>productoCompleto($pdo,$p),$rows));
}
if($path==='admin/productos' && $method==='POST'){
 $st=$pdo->prepare('INSERT INTO productos(codigo,categoria_id,nombre,slug,marca,descripcion,precio,precio_anterior,stock,rating,resenas,tags,destacado,nuevo,oferta,mas_vendido,estado) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)');
 $slug=preg_replace('/[^a-z0-9]+/','-',strtolower(iconv('UTF-8','ASCII//TRANSLIT',$data['nombre'])));$codigo=$data['codigo']?:('nx-'.time());
 $st->execute([$codigo,$data['categoria_id'],$data['nombre'],$slug,$data['marca'],$data['descripcion'],$data['precio'],$data['precio_anterior']?:null,$data['stock'],0,0,$data['tags']??'',!empty($data['destacado']),!empty($data['nuevo']),!empty($data['oferta']),!empty($data['mas_vendido']),$data['estado']??'activo']);$id=(int)$pdo->lastInsertId();
 foreach(($data['imagenes']??[]) as $i=>$ruta){if(trim($ruta)){ $im=$pdo->prepare('INSERT INTO producto_imagenes(producto_id,ruta_imagen,orden,es_principal) VALUES(?,?,?,?)');$im->execute([$id,trim($ruta),$i,$i===0]);}}
 jsonResponse(['ok'=>true,'id'=>$id],201);
}
if(preg_match('#^admin/productos/(\d+)$#',$path,$m) && in_array($method,['PUT','PATCH'])){
 $id=(int)$m[1];$st=$pdo->prepare('UPDATE productos SET categoria_id=?,nombre=?,marca=?,descripcion=?,precio=?,precio_anterior=?,stock=?,tags=?,destacado=?,nuevo=?,oferta=?,mas_vendido=?,estado=?,fecha_actualizacion=NOW() WHERE id=?');
 $st->execute([$data['categoria_id'],$data['nombre'],$data['marca'],$data['descripcion'],$data['precio'],$data['precio_anterior']?:null,$data['stock'],$data['tags']??'',!empty($data['destacado']),!empty($data['nuevo']),!empty($data['oferta']),!empty($data['mas_vendido']),$data['estado']??'activo',$id]);
 if(isset($data['imagenes'])){$pdo->prepare('DELETE FROM producto_imagenes WHERE producto_id=?')->execute([$id]);foreach($data['imagenes'] as $i=>$ruta){if(trim($ruta)){$im=$pdo->prepare('INSERT INTO producto_imagenes(producto_id,ruta_imagen,orden,es_principal) VALUES(?,?,?,?)');$im->execute([$id,trim($ruta),$i,$i===0]);}}}
 jsonResponse(['ok'=>true]);
}
if(preg_match('#^admin/productos/(\d+)$#',$path,$m) && $method==='DELETE'){
 $id=(int)$m[1];$st=$pdo->prepare('SELECT COUNT(*) FROM pedido_detalles WHERE producto_id=?');$st->execute([$id]);
 if((int)$st->fetchColumn()>0){$pdo->prepare('UPDATE productos SET estado="inactivo" WHERE id=?')->execute([$id]);jsonResponse(['ok'=>true,'mensaje'=>'Producto desactivado porque tiene pedidos relacionados.']);}
 $pdo->prepare('DELETE FROM productos WHERE id=?')->execute([$id]);jsonResponse(['ok'=>true,'mensaje'=>'Producto eliminado.']);
}
jsonResponse(['ok'=>false,'mensaje'=>'Ruta no encontrada: '.$path],404);
