<?php

declare(strict_types=1);

namespace App\Controllers;

require_once __DIR__ . '/../Services/LogService.php';
require_once __DIR__ . '/../Services/ApiService.php';

use PDO;
use PDOException;
use Database;
use AppConfig;
use Request;
use Response;
use Session;
use App\Services\LogService;
use App\Services\ApiService;
use Exception;

class VilleController {
  private PDO $db;
  private AppConfig $appConfig;

  public function __construct() {
    $this->db = Database::getInstance();
    $this->appConfig = AppConfig::getInstance();
  }

  /**
   * Recherche les villes dont le code postal commence par les chiffres saisis
   * 
   * @return void
   */
  public function searchVillesByPostalCode(): void {
    try {
      // Récupérer le paramètre code_postal de la requête
      $postalCode = Request::getValue('code_postal');

      if (empty($postalCode) || strlen($postalCode) < 3) {
        Response::json([
          'status' => 'error',
          'message' => 'Le code postal doit contenir au moins 3 chiffres'
        ], 400);
        return;
      }

      // Valider que le code postal ne contient que des chiffres
      if (!ctype_digit($postalCode)) {
        Response::json([
          'status' => 'error',
          'message' => 'Le code postal doit contenir uniquement des chiffres'
        ], 400);
        return;
      }

      // Rechercher les villes dont le code postal commence par les chiffres saisis
      $stmt = $this->db->prepare('
                SELECT id, fk_departement, libelle, code_postal
                FROM x_villes
                WHERE code_postal LIKE ?
                ORDER BY libelle ASC
                LIMIT 20
            ');

      $stmt->execute([$postalCode . '%']);
      $villes = $stmt->fetchAll(PDO::FETCH_ASSOC);

      // Renommer les champs pour une meilleure lisibilité côté client
      $result = [];
      foreach ($villes as $ville) {
        $result[] = [
          'id' => $ville['id'],
          'departement_id' => $ville['fk_departement'],
          'nom' => $ville['libelle'],
          'code_postal' => $ville['code_postal']
        ];
      }

      Response::json([
        'status' => 'success',
        'success' => true,
        'data' => $result
      ], 200);
    } catch (Exception $e) {
      LogService::log('Erreur lors de la recherche de villes par code postal', [
        'level' => 'error',
        'error' => $e->getMessage(),
        'postalCode' => $postalCode ?? 'non défini'
      ]);

      Response::json([
        'status' => 'error',
        'success' => false,
        'message' => 'Erreur lors de la recherche de villes'
      ], 500);
    }
  }
}
