<?php
namespace admin\controls;
class ShopProduct
{
  static public function generate_combination()
  {
    foreach ( $_POST as $key => $val )
    {
      if ( strpos( $key, 'attribute_' ) !== false )
      {
        $attribute = explode( 'attribute_', $key );
        $attributes[ $attribute[1] ] = $val;
      }
    }

    if ( \admin\factory\ShopProduct::generate_permutation( (int) \S::get( 'product_id' ), $attributes ) )
      \S::alert( 'Kombinacje produktu zostały wygenerowane.' );

    header( 'Location: /admin/shop_product/product_combination/product_id=' . (int) \S::get( 'product_id' ) );
    exit;
  }

  //usunięcie kombinacji produktu
  static public function delete_combination()
  {
    if ( \admin\factory\ShopProduct::delete_combination( (int)\S::get( 'combination_id' ) ) )
      \S::alert( 'Kombinacja produktu została usunięta' );
    else
      \S::alert( 'Podczas usuwania kombinacji produktu wystąpił błąd. Proszę spróbować ponownie' );

    header( 'Location: /admin/shop_product/product_combination/product_id=' . \S::get( 'product_id' ) );
    exit;
  }

  static public function duplicate_product()
  {
    if ( \admin\factory\ShopProduct::duplicate_product( (int)\S::get( 'product-id' ), (int)\S::get( 'combination' ) ) )
      \S::set_message( 'Produkt został zduplikowany.' );
    else
      \S::alert( 'Podczas duplikowania produktu wystąpił błąd. Proszę spróbować ponownie' );

    header( 'Location: /admin/shop_product/view_list/' );
    exit;
  }

  public static function image_delete()
  {
    $response = [ 'status' => 'error', 'msg' => 'Podczas usuwania zdjecia wystąpił błąd. Proszę spróbować ponownie.' ];

  if ( \admin\factory\ShopProduct::delete_img( \S::get( 'image_id' ) ) )
    $response = [ 'status' => 'ok' ];

  echo json_encode( $response );
  exit;
  }

  public static function images_order_save()
  {
    if ( \admin\factory\ShopProduct::images_order_save( \S::get( 'product_id' ), \S::get( 'order' ) ) )
      echo json_encode( [ 'status' => 'ok', 'msg' => 'Produkt został zapisany.' ] );

    exit;
  }

  public static function image_alt_change()
  {
    $response = [ 'status' => 'error', 'msg' => 'Podczas zmiany atrybutu alt zdjęcia wystąpił błąd. Proszę spróbować ponownie.' ];

    if ( \admin\factory\ShopProduct::image_alt_change( \S::get( 'image_id' ), \S::get( 'image_alt' ) ) )
      $response = [ 'status' => 'ok' ];

    echo json_encode( $response );
    exit;
  }

  // szybka zmiana statusu produktu
  static public function change_product_status() {

    if ( \admin\factory\ShopProduct::change_product_status( (int)\S::get( 'product-id' ) ) )
      \S::set_message( 'Status produktu został zmieniony' );

    header( 'Location: ' . $_SERVER['HTTP_REFERER'] );
    exit;
  }

  // szybka zmiana google xml label
  static public function product_change_custom_label()
  {
    $response = [ 'status' => 'error', 'msg' => 'Podczas zmiany google xml label wystąpił błąd. Proszę spróbować ponownie.' ];

    if ( \admin\factory\ShopProduct::product_change_custom_label( (int) \S::get( 'product_id' ), \S::get( 'custom_label' ), \S::get( 'value' ) ) )
      $response = [ 'status' => 'ok' ];

    echo json_encode( $response );
    exit;
  }

  // szybka zmiana ceny promocyjnej
  static public function product_change_price_brutto_promo()
  {
    $response = [ 'status' => 'error', 'msg' => 'Podczas zmiany ceny wystąpił błąd. Proszę spróbować ponownie.' ];

    if ( \admin\factory\ShopProduct::product_change_price_brutto_promo( (int) \S::get( 'product_id' ), \S::get( 'price' ) ) )
      $response = [ 'status' => 'ok' ];

    echo json_encode( $response );
    exit;
  }

  // szybka zmiana ceny
  static public function product_change_price_brutto()
  {
    $response = [ 'status' => 'error', 'msg' => 'Podczas zmiany ceny wystąpił błąd. Proszę spróbować ponownie.' ];

    if ( \admin\factory\ShopProduct::product_change_price_brutto( (int) \S::get( 'product_id' ), \S::get( 'price' ) ) )
      $response = [ 'status' => 'ok' ];

    echo json_encode( $response );
    exit;
  }

  // pobierz bezpośredni url produktu
  static public function ajax_product_url()
  {
    echo json_encode( [ 'url' => \shop\Product::getProductUrl( \S::get( 'product_id' ) ) ] );
    exit;
  }

  // zapisanie produktu
  public static function save()
  {
    $response = [ 'status' => 'error', 'msg' => 'Podczas zapisywania produktu wystąpił błąd. Proszę spróbować ponownie.' ];
    $values = json_decode( \S::get( 'values' ), true );

    if ( $id = \admin\factory\ShopProduct::save(
            $values['id'], $values['name'], $values['short_description'], $values['description'], $values['status'], $values['meta_description'], $values['meta_keywords'], $values['seo_link'],
            $values['copy_from'], $values['categories'], $values['price_netto'], $values['price_brutto'], $values['vat'], $values['promoted'], $values['warehouse_message_zero'], $values['warehouse_message_nonzero'], $values['tab_name_1'],
            $values['tab_description_1'], $values['tab_name_2'], $values['tab_description_2'], $values['layout_id'], $values['products_related'], (int) $values['set'], $values['price_netto_promo'], $values['price_brutto_promo'],
            $values['new_to_date'], $values['stock_0_buy'], $values['wp'], $values['custom_label_0'], $values['custom_label_1'], $values['custom_label_2'], $values['custom_label_3'], $values['custom_label_4'], $values['additional_message'], (int)$values['quantity'], $values['additional_message_text'], $values['additional_message_required'] == 'on' ? 1 : 0, $values['canonical'], $values['meta_title'], $values['producer_id'], $values['sku'], $values['ean'], $values['product_unit'], $values['weight'], $values['xml_name'], $values['custom_field_name'], $values['custom_field_required'], $values['security_information'], $values['custom_field_type']
          ) ) {
      $response = [ 'status' => 'ok', 'msg' => 'Produkt został zapisany.', 'id' => $id ];
    }

    echo json_encode( $response );
    exit;
  }

  // product_unarchive
  static public function product_unarchive()
  {
    if ( \admin\factory\ShopProduct::product_unarchive( (int) \S::get( 'product_id' ) ) )
      \S::alert( 'Produkt został przywrócony z archiwum.' );
    else
      \S::alert( 'Podczas przywracania produktu z archiwum wystąpił błąd. Proszę spróbować ponownie' );

    header( 'Location: /admin/product_archive/list/' );
    exit;
  }

  static public function product_archive()
  {
    if ( \admin\factory\ShopProduct::product_archive( (int) \S::get( 'product_id' ) ) )
      \S::alert( 'Produkt został przeniesiony do archiwum.' );
    else
      \S::alert( 'Podczas przenoszenia produktu do archiwum wystąpił błąd. Proszę spróbować ponownie' );

    header( 'Location: /admin/shop_product/view_list/' );
    exit;
  }

  public static function product_delete()
  {
    if ( \admin\factory\ShopProduct::product_delete( (int) \S::get( 'id' ) ) )
      \S::set_message( 'Produkt został usunięty.' );
    else
      \S::alert( 'Podczas usuwania produktu wystąpił błąd. Proszę spróbować ponownie' );
    header( 'Location: /admin/shop_product/view_list/' );
    exit;
  }

  // edycja produktu
  public static function product_edit() {
    global $user, $mdb;

    if ( !$user ) {
      header( 'Location: /admin/' );
      exit;
    }

    \admin\factory\ShopProduct::delete_nonassigned_images();
    \admin\factory\ShopProduct::delete_nonassigned_files();

    return \Tpl::view( 'shop-product/product-edit', [
      'product'     => \admin\factory\ShopProduct::product_details( (int) \S::get( 'id' ) ),
      'languages'   => ( new \Domain\Languages\LanguagesRepository( $GLOBALS['mdb'] ) )->languagesList(),
      'categories'  => ( new \Domain\Category\CategoryRepository( $GLOBALS['mdb'] ) )->subcategories( null ),
      'layouts'     => self::layouts_for_product_edit( $mdb ),
      'products'    => \admin\factory\ShopProduct::products_list(),
      'dlang'       => \front\factory\Languages::default_language(),
      'sets'        => \shop\ProductSet::sets_list(),
      'producers'   => ( new \Domain\Producer\ProducerRepository( $mdb ) )->allProducers(),
      'units'       => ( new \Domain\Dictionaries\DictionariesRepository( $mdb ) ) -> allUnits(),
      'user'        => $user
    ] );
  }

  private static function layouts_for_product_edit( $db )
  {
    if ( class_exists( '\Domain\Layouts\LayoutsRepository' ) )
    {
      $rows = ( new \Domain\Layouts\LayoutsRepository( $db ) ) -> listAll();
      return is_array( $rows ) ? $rows : [];
    }

    return [];
  }

  // ajax_load_products ARCHIVE
  static public function ajax_load_products_archive()
  {
    echo json_encode( [
      'status' => 'deprecated',
      'msg' => 'Endpoint nie jest juz wspierany. Uzyj /admin/product_archive/list/.',
      'redirect_url' => '/admin/product_archive/list/'
    ] );
    exit;
  }

  // ajax_load_products
  static public function ajax_load_products() {

    $response = [ 'status' => 'error', 'msg' => 'Podczas ładowania produktów wystąpił błąd. Proszę spróbować ponownie.' ];

    \S::set_session( 'products_list_current_page', \S::get( 'current_page' ) );
    \S::set_session( 'products_list_query', \S::get( 'query' ) );

    if ( $products = \admin\factory\ShopProduct::ajax_products_list( \S::get_session( 'products_list_current_page' ), \S::get_session( 'products_list_query' ) ) ) {
      $response = [
        'status' => 'ok',
        'pagination_max' => ceil( $products['products_count'] / 10 ),
        'html' => \Tpl::view( 'shop-product/products-list-table', [
          'products' => $products['products'],
          'current_page' => \S::get( 'current_page' ),
          'apilo_enabled' => \admin\factory\Integrations::apilo_settings( 'enabled' ),
          'show_xml_data' => \S::get_session( 'show_xml_data' )
        ] )
      ];
    }

    echo json_encode( $response );
    exit;
  }

  static public function view_list()
  {
    $current_page = \S::get_session( 'products_list_current_page' );

    if ( !$current_page ) {
      $current_page = 1;
      \S::set_session( 'products_list_current_page', $current_page );
    }

    $query = \S::get_session( 'products_list_query' );
    if ( $query ) {
      $query_array = [];
      parse_str( $query, $query_array );
    }

    if ( \S::get( 'show_xml_data' ) === 'true' ) {
      \S::set_session( 'show_xml_data', true );
    } else if ( \S::get( 'show_xml_data' ) === 'false' ) {
      \S::set_session( 'show_xml_data', false );
    }

    return \Tpl::view( 'shop-product/products-list', [
      'current_page' => $current_page,
      'query_array' => $query_array,
      'pagination_max' => ceil( \admin\factory\ShopProduct::count_product() / 10 ),
      'apilo_enabled' => \admin\factory\Integrations::apilo_settings( 'enabled' ),
      'show_xml_data' => \S::get_session( 'show_xml_data' ),
      'shoppro_enabled' => \admin\factory\Integrations::shoppro_settings( 'enabled' )
    ] );
  }

  //
  // KOMBINACJE PRODUKTU
  //

  // zapisanie możliwości zakupu przy stanie 0 w kombinacji produktu
  static public function product_combination_stock_0_buy_save()
  {
    \admin\factory\ShopProduct::product_combination_stock_0_buy_save( (int)\S::get( 'product_id' ), \S::get( 'stock_0_buy' ) );
    exit;
  }

  // zapisanie sku w kombinacji produktu
  static public function product_combination_sku_save()
  {
    \admin\factory\ShopProduct::product_combination_sku_save( (int)\S::get( 'product_id' ), \S::get( 'sku' ) );
    exit;
  }

  // zapisanie ilości w kombinacji produktu
  static public function product_combination_quantity_save()
  {
    \admin\factory\ShopProduct::product_combination_quantity_save( (int)\S::get( 'product_id' ), \S::get( 'quantity' ) );
    exit;
  }

  // zapisanie ceny w kombinacji produktu
  static public function product_combination_price_save()
  {
    \admin\factory\ShopProduct::product_combination_price_save( (int)\S::get( 'product_id' ), \S::get( 'price' ) );
    exit;
  }

  //wyświetlenie kombinacji produktu
  static public function product_combination()
  {
    global $mdb;

    return \Tpl::view( 'shop-product/product-combination', [
      'product' => \admin\factory\ShopProduct::product_details( (int) \S::get( 'product_id' ) ),
      'attributes' => ( new \Domain\Attribute\AttributeRepository( $mdb ) ) -> getAttributesListForCombinations(),
      'default_language' => \front\factory\Languages::default_language(),
      'product_permutations' => \admin\factory\ShopProduct::get_product_permutations( (int) \S::get( 'product_id' ) )
    ] );
  }

  // generate_sku_code
  static public function generate_sku_code() {
    $response = [ 'status' => 'error', 'msg' => 'Podczas generowania kodu sku wystąpił błąd. Proszę spróbować ponownie.' ];

    if ( $sku = \shop\Product::generate_sku_code( \S::get( 'product_id' ) ) )
      $response = [ 'status' => 'ok', 'sku' => $sku ];

    echo json_encode( $response );
    exit;
  }

  // product_xml_name_save
  static public function product_xml_name_save() {
    $response = [ 'status' => 'error', 'msg' => 'Podczas zapisywania nazwy produktu wystąpił błąd. Proszę spróbować ponownie.' ];

    if (  \shop\Product::product_xml_name_save( \S::get( 'product_id' ), \S::get( 'product_xml_name' ), \S::get( 'lang_id' ) ) )
      $response = [ 'status' => 'ok' ];

    echo json_encode( $response );
    exit;
  }

  // product_custom_label_suggestions
  static public function product_custom_label_suggestions() {
    $response = [ 'status' => 'error', 'msg' => 'Podczas pobierania sugestii dla custom label wystąpił błąd. Proszę spróbować ponownie.' ];

    if ( $suggestions = \shop\Product::product_custom_label_suggestions( \S::get( 'custom_label' ), \S::get( 'label_type' ) ) )
      $response = [ 'status' => 'ok', 'suggestions' => $suggestions ];

    echo json_encode( $response );
    exit;
  }

  // product_custom_label_save
  static public function product_custom_label_save() {
    $response = [ 'status' => 'error', 'msg' => 'Podczas zapisywania custom label wystąpił błąd. Proszę spróbować ponownie.' ];

    if ( \shop\Product::product_custom_label_save( \S::get( 'product_id' ), \S::get( 'custom_label' ), \S::get( 'label_type' ) ) )
      $response = [ 'status' => 'ok' ];

    echo json_encode( $response );
    exit;
  }
}
