<?php

namespace AC_SYNC\Includes\Classes\Brand {

  if (!defined('ABSPATH'))
    exit; // Exit if accessed directly

  use AC_SYNC\Includes\Classes\Logger\Action_Wear_Log as Log;

  /**
   * Action_Wear_Brand
   *
   * Gestisce la sincronizzazione dei brand da ActionWear a WooCommerce
   * I brand vengono creati come tassonomia nativa "product_brand"
   *
   * @package AC_SYNC
   * @subpackage Includes/Classes/Brand
   */
  class Action_Wear_Brand
  {
    // Costanti per la gestione dei brand
    const BRAND_TAXONOMY = 'product_brand';
    const BRAND_TAXONOMY_LABEL = 'Brand';

    /**
     * Verifica se la tassonomia brand è registrata in WooCommerce
     *
     * @return bool
     */
    public static function isBrandTaxonomyAvailable()
    {
      return taxonomy_exists(self::BRAND_TAXONOMY);
    }

    /**
     * Crea o recupera un brand WooCommerce
     *
     * @param string $brand_name Nome del brand da ActionWear
     * @param int $brand_id ID del brand da ActionWear
     * @return int|false Term ID del brand creato/recuperato o false se errore
     */
    public static function createOrGetBrand($brand_name, $brand_id = 0)
    {
      if (empty($brand_name)) {
        return false;
      }

      if (!self::isBrandTaxonomyAvailable()) {
        return false;
      }

      // Normalizza il nome del brand
      $brand_slug = sanitize_title($brand_name);

      // Cerca un term esistente con questo slug
      $existing_term = get_term_by('slug', $brand_slug, self::BRAND_TAXONOMY);

      if ($existing_term && !is_wp_error($existing_term)) {
        // Brand già esiste, aggiorna i metadati se necessario
        if ($brand_id > 0) {
          update_term_meta($existing_term->term_id, 'actionwear_brand_id', $brand_id);
        }
        return $existing_term->term_id;
      }

      // Crea un nuovo term per il brand nella tassonomia nativa 'product_brand'
      $term = wp_insert_term(
        $brand_name,
        self::BRAND_TAXONOMY,
        [
          'slug' => $brand_slug,
          'description' => 'Brand from ActionWear'
        ]
      );

      if (is_wp_error($term)) {
        Log::write(
          "Errore nella creazione del brand: $brand_name. Errore: " . $term->get_error_message(),
          Log::ERROR,
          Log::CONTEXT_PRODUCT_CREATION
        );
        return false;
      }

      $term_id = $term['term_id'];

      // Salva l'ID del brand ActionWear come meta
      if ($brand_id > 0) {
        update_term_meta($term_id, 'actionwear_brand_id', $brand_id);
      }

      Log::write(
        "Brand '$brand_name' creato con successo (Term ID: $term_id)",
        Log::INFO,
        Log::CONTEXT_PRODUCT_CREATION
      );

      return $term_id;
    }

    /**
     * Assegna un brand a un prodotto WooCommerce
     *
     * @param int $product_id ID del prodotto WooCommerce
     * @param string $brand_name Nome del brand
     * @param int $brand_id ID del brand ActionWear
     * @return bool True se l'associazione è avvenuta con successo
     */
    public static function assignBrandToProduct($product_id, $brand_name, $brand_id = 0)
    {
      if (empty($product_id) || empty($brand_name)) {
        return false;
      }

      if (!self::isBrandTaxonomyAvailable()) {
        return false;
      }

      // Crea o recupera il brand
      $term_id = self::createOrGetBrand($brand_name, $brand_id);

      if (!$term_id) {
        return false;
      }

      // Assegna il term al prodotto
      $result = wp_set_object_terms($product_id, $term_id, self::BRAND_TAXONOMY, false);

      if (is_wp_error($result)) {
        Log::write(
          "Errore nell'assegnazione del brand '$brand_name' al prodotto ID: $product_id. Errore: " . $result->get_error_message(),
          Log::ERROR,
          Log::CONTEXT_PRODUCT_CREATION
        );
        return false;
      }

      Log::write(
        "Brand '$brand_name' assegnato al prodotto ID: $product_id",
        Log::INFO,
        Log::CONTEXT_PRODUCT_CREATION
      );

      return true;
    }

    /**
     * Assegna un brand a una variante di prodotto
     *
     * @param int $variation_id ID della variante
     * @param string $brand_name Nome del brand
     * @param int $brand_id ID del brand ActionWear
     * @return bool True se l'associazione è avvenuta con successo
     */
    public static function assignBrandToVariation($variation_id, $brand_name, $brand_id = 0)
    {
      if (empty($variation_id) || empty($brand_name)) {
        return false;
      }

      if (!self::isBrandTaxonomyAvailable()) {
        return false;
      }

      // Crea o recupera il brand
      $term_id = self::createOrGetBrand($brand_name, $brand_id);

      if (!$term_id) {
        return false;
      }

      // Assegna il term alla variante tramite il prodotto padre
      $variation = wc_get_product($variation_id);
      if (!$variation || !$variation instanceof \WC_Product_Variation) {
        return false;
      }

      $parent_id = $variation->get_parent_id();
      $result = wp_set_object_terms($parent_id, $term_id, self::BRAND_TAXONOMY, true);

      if (is_wp_error($result)) {
        Log::write(
          "Errore nell'assegnazione del brand '$brand_name' alla variante ID: $variation_id. Errore: " . $result->get_error_message(),
          Log::ERROR,
          Log::CONTEXT_PRODUCT_CREATION
        );
        return false;
      }

      return true;
    }

    /**
     * Recupera tutti i brand creati per ActionWear
     *
     * @return array Array di brand terms
     */
    public static function getAllBrands()
    {
      if (!self::isBrandTaxonomyAvailable()) {
        return [];
      }

      $args = [
        'taxonomy' => self::BRAND_TAXONOMY,
        'hide_empty' => false,
        'meta_query' => [
          [
            'key' => 'actionwear_brand_id',
            'compare' => 'EXISTS'
          ]
        ]
      ];

      return get_terms($args);
    }

    /**
     * Recupera un brand per ID ActionWear
     *
     * @param int $actionwear_brand_id ID del brand ActionWear
     * @return WP_Term|false Term del brand o false se non trovato
     */
    public static function getBrandByActionWearId($actionwear_brand_id)
    {
      if (!self::isBrandTaxonomyAvailable()) {
        return false;
      }

      $args = [
        'taxonomy' => self::BRAND_TAXONOMY,
        'meta_query' => [
          [
            'key' => 'actionwear_brand_id',
            'value' => $actionwear_brand_id,
            'compare' => '='
          ]
        ]
      ];

      $terms = get_terms($args);

      if (empty($terms) || is_wp_error($terms)) {
        return false;
      }

      return $terms[0];
    }


    /**
     * Cancella tutti i brand WooCommerce creati per ActionWear
     *
     * @return bool True se la cancellazione è avvenuta con successo
     */
    public static function deleteAllBrands()
    {
      if (!self::isBrandTaxonomyAvailable()) {
        return true;
      }

      $brands = self::getAllBrands();

      if (empty($brands) || is_wp_error($brands)) {
        return true;
      }

      foreach ($brands as $brand) {
        wp_delete_term($brand->term_id, self::BRAND_TAXONOMY);
      }

      Log::write(
        "Tutti i brand ActionWear sono stati eliminati",
        Log::INFO,
        Log::CONTEXT_PRODUCT_CREATION
      );

      return true;
    }

    /**
     * Ottiene i brand associati a un prodotto
     *
     * @param int $product_id ID del prodotto
     * @return array Array di WP_Term per i brand associati
     */
    public static function getProductBrands($product_id)
    {
      if (!self::isBrandTaxonomyAvailable()) {
        return [];
      }

      $terms = wp_get_post_terms($product_id, self::BRAND_TAXONOMY);

      if (is_wp_error($terms)) {
        return [];
      }

      return $terms;
    }
  }
}
