<?php
session_start();
date_default_timezone_set('America/Argentina/Cordoba');

const ADMIN_PASSWORD = '1064';
const JSON_PATH = __DIR__ . '/data/productos.json';
const DATA_DIR = __DIR__ . '/data';
const UPLOAD_DIR = __DIR__ . '/img/productos';
const UPLOAD_PUBLIC = 'img/productos';
const MAX_UPLOAD_BYTES = 8388608;

$errors = [];
$success = '';

function h($value) {
    return htmlspecialchars((string)$value, ENT_QUOTES, 'UTF-8');
}

function csrf_token() {
    if (empty($_SESSION['csrf_token'])) {
        $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
    }
    return $_SESSION['csrf_token'];
}

function check_csrf() {
    return isset($_POST['csrf'], $_SESSION['csrf_token']) && hash_equals($_SESSION['csrf_token'], (string)$_POST['csrf']);
}

function ensure_storage(&$errors) {
    if (!is_dir(DATA_DIR) && !mkdir(DATA_DIR, 0755, true)) {
        $errors[] = 'No se pudo crear la carpeta data/. Revisá permisos.';
    }
    if (!is_dir(UPLOAD_DIR) && !mkdir(UPLOAD_DIR, 0755, true)) {
        $errors[] = 'No se pudo crear la carpeta img/productos/. Revisá permisos.';
    }
    if (is_dir(DATA_DIR) && !is_writable(DATA_DIR)) {
        $errors[] = 'La carpeta data/ no tiene permisos de escritura.';
    }
    if (is_dir(UPLOAD_DIR) && !is_writable(UPLOAD_DIR)) {
        $errors[] = 'La carpeta img/productos/ no tiene permisos de escritura.';
    }
    if (!file_exists(JSON_PATH)) {
        if (@file_put_contents(JSON_PATH, "[]") === false) {
            $errors[] = 'No se pudo crear data/productos.json. Revisá permisos.';
        }
    }
    if (file_exists(JSON_PATH) && !is_writable(JSON_PATH)) {
        $errors[] = 'El archivo data/productos.json no tiene permisos de escritura.';
    }
}

function read_products() {
    if (!file_exists(JSON_PATH)) return [];
    $raw = file_get_contents(JSON_PATH);
    $data = json_decode($raw ?: '[]', true);
    return is_array($data) ? $data : [];
}

function save_products($items) {
    $json = json_encode(array_values($items), JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
    return file_put_contents(JSON_PATH, $json, LOCK_EX) !== false;
}

function clean_text($value) {
    return trim(strip_tags((string)$value));
}

function valid_image_type($tmp, $ext, &$detectedMime = '') {
    $allowedMime = [
        'jpg' => ['image/jpeg', 'image/pjpeg'],
        'jpeg' => ['image/jpeg', 'image/pjpeg'],
        'png' => ['image/png'],
        'webp' => ['image/webp'],
        'gif' => ['image/gif']
    ];
    $finfo = new finfo(FILEINFO_MIME_TYPE);
    $detectedMime = $finfo->file($tmp) ?: '';
    if (isset($allowedMime[$ext]) && in_array($detectedMime, $allowedMime[$ext], true)) return true;
    $info = @getimagesize($tmp);
    if (!$info || empty($info[2])) return false;
    $map = [
        IMAGETYPE_JPEG => ['jpg', 'jpeg'],
        IMAGETYPE_PNG => ['png'],
        IMAGETYPE_WEBP => ['webp'],
        IMAGETYPE_GIF => ['gif']
    ];
    return isset($map[$info[2]]) && in_array($ext, $map[$info[2]], true);
}

function upload_image($field, $required, &$errors) {
    if (empty($_FILES[$field]) || !isset($_FILES[$field]['error'])) {
        if ($required) $errors[] = 'Tenés que subir una imagen.';
        return null;
    }
    $file = $_FILES[$field];
    if ($file['error'] === UPLOAD_ERR_NO_FILE) {
        if ($required) $errors[] = 'Tenés que subir una imagen.';
        return null;
    }
    if ($file['error'] !== UPLOAD_ERR_OK) {
        $errors[] = 'No se pudo subir la imagen. Código de error: ' . (int)$file['error'];
        return null;
    }
    if ((int)$file['size'] > MAX_UPLOAD_BYTES) {
        $errors[] = 'La imagen supera el máximo permitido de 8 MB.';
        return null;
    }
    $original = (string)$file['name'];
    $ext = strtolower(pathinfo($original, PATHINFO_EXTENSION));
    $allowedExt = ['jpg', 'jpeg', 'png', 'webp', 'gif'];
    if (!in_array($ext, $allowedExt, true)) {
        $errors[] = 'Formato no permitido. Usá JPG, JPEG, PNG, WEBP o GIF.';
        return null;
    }
    $mime = '';
    if (!valid_image_type($file['tmp_name'], $ext, $mime)) {
        $errors[] = 'El archivo no parece ser una imagen válida. MIME detectado: ' . ($mime ?: 'desconocido');
        return null;
    }
    if (!is_dir(UPLOAD_DIR) || !is_writable(UPLOAD_DIR)) {
        $errors[] = 'La carpeta img/productos/ no está disponible para guardar imágenes.';
        return null;
    }
    $safeExt = $ext === 'jpeg' ? 'jpg' : $ext;
    $name = 'producto_' . date('Ymd_His') . '_' . bin2hex(random_bytes(3)) . '.' . $safeExt;
    $dest = UPLOAD_DIR . '/' . $name;
    if (!move_uploaded_file($file['tmp_name'], $dest)) {
        $errors[] = 'No se pudo guardar la imagen en img/productos/.';
        return null;
    }
    @chmod($dest, 0644);
    return UPLOAD_PUBLIC . '/' . $name;
}

function delete_image_if_local($path) {
    $path = (string)$path;
    if ($path === '' || strpos($path, UPLOAD_PUBLIC . '/') !== 0) return;
    $file = basename($path);
    $full = UPLOAD_DIR . '/' . $file;
    $realUpload = realpath(UPLOAD_DIR);
    $realFile = file_exists($full) ? realpath($full) : false;
    if ($realUpload && $realFile && strpos($realFile, $realUpload) === 0 && is_file($realFile)) {
        @unlink($realFile);
    }
}

function find_product_index($items, $id) {
    foreach ($items as $i => $item) {
        if (($item['id'] ?? '') === $id) return $i;
    }
    return -1;
}

ensure_storage($errors);
$csrf = csrf_token();
$isLogged = !empty($_SESSION['productos_admin']);

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $action = $_POST['action'] ?? '';
    if ($action === 'login') {
        if (!check_csrf()) {
            $errors[] = 'Token inválido. Recargá la página e intentá de nuevo.';
        } elseif (hash_equals(ADMIN_PASSWORD, (string)($_POST['password'] ?? ''))) {
            $_SESSION['productos_admin'] = true;
            header('Location: admin_productos.php');
            exit;
        } else {
            $errors[] = 'Clave incorrecta.';
        }
    } elseif ($action === 'logout') {
        if (check_csrf()) {
            unset($_SESSION['productos_admin']);
            header('Location: admin_productos.php');
            exit;
        }
    } elseif (!$isLogged) {
        $errors[] = 'Tenés que iniciar sesión.';
    } elseif (!check_csrf()) {
        $errors[] = 'Token inválido. Recargá la página e intentá de nuevo.';
    } elseif (!$errors) {
        $items = read_products();
        if ($action === 'create') {
            $image = upload_image('imagen', true, $errors);
            if (!$errors && $image) {
                array_unshift($items, [
                    'id' => 'prod_' . date('YmdHis') . '_' . bin2hex(random_bytes(4)),
                    'imagen' => $image,
                    'titulo' => clean_text($_POST['titulo'] ?? ''),
                    'precio' => clean_text($_POST['precio'] ?? ''),
                    'descripcion' => clean_text($_POST['descripcion'] ?? ''),
                    'creado' => date('Y-m-d H:i:s')
                ]);
                if (save_products($items)) {
                    $success = 'Producto publicado correctamente.';
                } else {
                    $errors[] = 'No se pudo escribir data/productos.json.';
                }
            }
        } elseif ($action === 'update') {
            $id = clean_text($_POST['id'] ?? '');
            $idx = find_product_index($items, $id);
            if ($idx < 0) {
                $errors[] = 'No se encontró el producto para editar.';
            } else {
                $oldImage = $items[$idx]['imagen'] ?? '';
                $newImage = upload_image('imagen', false, $errors);
                if (!$errors) {
                    if ($newImage) {
                        $items[$idx]['imagen'] = $newImage;
                        delete_image_if_local($oldImage);
                    }
                    $items[$idx]['titulo'] = clean_text($_POST['titulo'] ?? '');
                    $items[$idx]['precio'] = clean_text($_POST['precio'] ?? '');
                    $items[$idx]['descripcion'] = clean_text($_POST['descripcion'] ?? '');
                    if (save_products($items)) {
                        $success = 'Producto actualizado correctamente.';
                    } else {
                        $errors[] = 'No se pudo escribir data/productos.json.';
                    }
                }
            }
        } elseif ($action === 'delete') {
            $id = clean_text($_POST['id'] ?? '');
            $idx = find_product_index($items, $id);
            if ($idx < 0) {
                $errors[] = 'No se encontró el producto para eliminar.';
            } else {
                $image = $items[$idx]['imagen'] ?? '';
                array_splice($items, $idx, 1);
                if (save_products($items)) {
                    delete_image_if_local($image);
                    $success = 'Producto eliminado correctamente.';
                } else {
                    $errors[] = 'No se pudo escribir data/productos.json.';
                }
            }
        }
    }
}

$products = $isLogged ? read_products() : [];
?>
<!doctype html>
<html lang="es">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Admin productos | San Juan Padel Shop</title>
  <link rel="icon" href="img/logo.png" type="image/png">
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
  <style>
    :root{--accent:#dcfe16;--ink:#111;--muted:#666;--line:rgba(0,0,0,.12);--soft:#f7f7f2}
    body{background:var(--soft);color:var(--ink);font-family:system-ui,-apple-system,Segoe UI,Roboto,Arial,sans-serif}
    .admin-wrap{max-width:1120px;margin:0 auto;padding:34px 16px 60px}
    .admin-top{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:24px;flex-wrap:wrap}
    .brand{display:flex;align-items:center;gap:12px;font-weight:800;font-size:20px;letter-spacing:.02em}
    .brand img{height:44px;width:auto;object-fit:contain}
    .panel{background:#fff;border:1px solid var(--line);box-shadow:0 18px 50px rgba(0,0,0,.08);padding:24px;margin-bottom:22px}
    .login-card{max-width:430px;margin:10vh auto 0}
    .btn-main{background:var(--accent);border:0;color:#111;font-weight:800;text-transform:uppercase;letter-spacing:.04em;min-height:44px;padding:0 18px}
    .btn-main:hover{background:#c9eb0f;color:#111}
    .btn-dark-clean{background:#111;color:#fff;border:0;min-height:42px;padding:0 16px;font-weight:700;text-transform:uppercase;letter-spacing:.04em}
    .btn-danger-clean{background:#c62828;color:#fff;border:0;min-height:42px;padding:0 16px;font-weight:700;text-transform:uppercase;letter-spacing:.04em}
    .btn-light-clean{background:#fff;color:#111;border:1px solid var(--line);min-height:42px;padding:0 16px;font-weight:700;text-transform:uppercase;letter-spacing:.04em}
    label{font-size:12px;font-weight:800;text-transform:uppercase;letter-spacing:.08em;color:var(--muted);margin-bottom:7px}
    .form-control,.form-select{border-radius:0;border:1px solid var(--line);min-height:46px;box-shadow:none!important}
    .form-control:focus{border-color:#111}
    textarea.form-control{min-height:94px}
    .alert{border-radius:0;border:0}
    .product-admin-card{display:grid;grid-template-columns:190px 1fr;gap:18px;border:1px solid var(--line);background:#fff;padding:16px;margin-bottom:16px}
    .product-admin-img{height:170px;background:#fff;border:1px solid var(--line);display:flex;align-items:center;justify-content:center;padding:8px}
    .product-admin-img img{max-width:100%;max-height:100%;object-fit:contain}
    .product-actions{display:flex;gap:10px;flex-wrap:wrap;align-items:center;margin-top:12px}
    .muted{color:var(--muted);font-size:14px}
    .empty{padding:22px;text-align:center;color:var(--muted);border:1px dashed var(--line);background:#fff}
    @media(max-width:700px){.product-admin-card{grid-template-columns:1fr}.product-admin-img{height:240px}.admin-top{align-items:flex-start}.brand{font-size:18px}}
  </style>
</head>
<body>
  <div class="admin-wrap">
    <div class="admin-top">
      <div class="brand"><img src="img/logo.png" alt="San Juan Padel Shop"><span>San Juan Padel Shop</span></div>
      <div class="d-flex gap-2 flex-wrap">
        <a class="btn-light-clean d-inline-flex align-items-center" href="index.html#productos-json" target="_blank" rel="noopener">Ver en el sitio</a>
        <?php if ($isLogged): ?>
          <form method="post" class="m-0"><input type="hidden" name="csrf" value="<?= h($csrf) ?>"><input type="hidden" name="action" value="logout"><button class="btn-dark-clean" type="submit">Salir</button></form>
        <?php endif; ?>
      </div>
    </div>

    <?php foreach ($errors as $error): ?><div class="alert alert-danger"><?= h($error) ?></div><?php endforeach; ?>
    <?php if ($success): ?><div class="alert alert-success"><?= h($success) ?></div><?php endif; ?>

    <?php if (!$isLogged): ?>
      <div class="panel login-card">
        <h1 class="h4 mb-3">Acceso al panel</h1>
        <form method="post">
          <input type="hidden" name="csrf" value="<?= h($csrf) ?>">
          <input type="hidden" name="action" value="login">
          <div class="mb-3">
            <label for="password">Clave</label>
            <input class="form-control" type="password" name="password" id="password" required autofocus>
          </div>
          <button class="btn-main w-100" type="submit">Ingresar</button>
        </form>
      </div>
    <?php else: ?>
      <section class="panel">
        <h1 class="h4 mb-2">Cargar producto, flyer o novedad</h1>
        <p class="muted mb-4">Las imágenes se guardan en img/productos/ y la información en data/productos.json.</p>
        <form method="post" enctype="multipart/form-data">
          <input type="hidden" name="csrf" value="<?= h($csrf) ?>">
          <input type="hidden" name="action" value="create">
          <div class="row g-3">
            <div class="col-lg-5">
              <label for="imagen">Imagen</label>
              <input class="form-control" type="file" name="imagen" id="imagen" accept=".jpg,.jpeg,.png,.webp,.gif" required>
            </div>
            <div class="col-lg-4">
              <label for="titulo">Título / nombre</label>
              <input class="form-control" type="text" name="titulo" id="titulo" maxlength="120" placeholder="Nombre del producto">
            </div>
            <div class="col-lg-3">
              <label for="precio">Precio opcional</label>
              <input class="form-control" type="text" name="precio" id="precio" maxlength="60" placeholder="1500 o $ 1500">
            </div>
            <div class="col-12">
              <label for="descripcion">Descripción opcional</label>
              <textarea class="form-control" name="descripcion" id="descripcion" maxlength="600" placeholder="Detalle breve, talle, modelo o novedad"></textarea>
            </div>
            <div class="col-12">
              <button class="btn-main" type="submit">Publicar</button>
            </div>
          </div>
        </form>
      </section>

      <section class="panel">
        <h2 class="h5 mb-3">Productos publicados</h2>
        <?php if (!$products): ?>
          <div class="empty">Todavía no hay productos publicados.</div>
        <?php endif; ?>
        <?php foreach ($products as $item): ?>
          <div class="product-admin-card">
            <div class="product-admin-img">
              <?php if (!empty($item['imagen'])): ?><img src="<?= h($item['imagen']) ?>" alt="<?= h($item['titulo'] ?? 'Producto') ?>"><?php endif; ?>
            </div>
            <div>
              <form method="post" enctype="multipart/form-data">
                <input type="hidden" name="csrf" value="<?= h($csrf) ?>">
                <input type="hidden" name="action" value="update">
                <input type="hidden" name="id" value="<?= h($item['id'] ?? '') ?>">
                <div class="row g-3">
                  <div class="col-lg-5">
                    <label>Título / nombre</label>
                    <input class="form-control" type="text" name="titulo" maxlength="120" value="<?= h($item['titulo'] ?? '') ?>">
                  </div>
                  <div class="col-lg-3">
                    <label>Precio opcional</label>
                    <input class="form-control" type="text" name="precio" maxlength="60" value="<?= h($item['precio'] ?? '') ?>">
                  </div>
                  <div class="col-lg-4">
                    <label>Cambiar imagen</label>
                    <input class="form-control" type="file" name="imagen" accept=".jpg,.jpeg,.png,.webp,.gif">
                  </div>
                  <div class="col-12">
                    <label>Descripción opcional</label>
                    <textarea class="form-control" name="descripcion" maxlength="600"><?= h($item['descripcion'] ?? '') ?></textarea>
                  </div>
                </div>
                <div class="product-actions">
                  <button class="btn-main" type="submit">Guardar cambios</button>
                  <span class="muted">Creado: <?= h($item['creado'] ?? '') ?></span>
                </div>
              </form>
              <form method="post" class="product-actions" onsubmit="return confirm('¿Eliminar este producto?');">
                <input type="hidden" name="csrf" value="<?= h($csrf) ?>">
                <input type="hidden" name="action" value="delete">
                <input type="hidden" name="id" value="<?= h($item['id'] ?? '') ?>">
                <button class="btn-danger-clean" type="submit">Eliminar</button>
              </form>
            </div>
          </div>
        <?php endforeach; ?>
      </section>
    <?php endif; ?>
  </div>
</body>
</html>
