<?php

class ControllerCheckoutShippingAddress extends Controller
{
  public function index()
  {

    $this->app();

    $this->language->load('checkout/checkout');
    $this->data['text_address_existing'] = $this->language->get('text_address_existing');
    $this->data['text_address_new'] = $this->language->get('text_address_new');

    $this->data['text_checkout_shipping_address'] = $this->language->get('text_checkout_shipping_address');
    $this->data['text_shipping_address'] = $this->language->get('text_shipping_address');
    $this->data['text_select'] = $this->language->get('text_select');
    $this->data['text_none'] = $this->language->get('text_none');
    $this->data['entry_firstname'] = $this->language->get('entry_firstname');
    $this->data['entry_lastname'] = $this->language->get('entry_lastname');
    $this->data['entry_company'] = $this->language->get('entry_company');
    $this->data['entry_address_1'] = $this->language->get('entry_address_1');
    $this->data['entry_numero'] = $this->language->get('entry_numero');
    $this->data['entry_complemento'] = $this->language->get('entry_complemento');
    $this->data['entry_address_2'] = $this->language->get('entry_address_2');
    $this->data['entry_postcode'] = $this->language->get('entry_postcode');
    $this->data['entry_city'] = $this->language->get('entry_city');
    $this->data['entry_zone'] = $this->language->get('entry_zone');
    $this->data['button_continue'] = $this->language->get('button_continue');
    $this->data['entry_place'] = $this->language->get('entry_place');

    $this->data['custom_scripts'] = array(
      $this->ftrgeralregistry->getScriptManifest('catalog/view/theme/vista/public/js/medidor-de-senha.js', false),
      'catalog/view/theme/vista/js/jquery/jquery.validate.js?version=' . filesize('catalog/view/theme/vista/js/jquery/jquery.validate.js'),
      'catalog/view/theme/vista/js/jquery/additional-methods.js?version=' . filesize('catalog/view/theme/vista/js/jquery/additional-methods.js'),
      'catalog/view/theme/vista/js/jquery/jquery.validate.futura-methods.js?version=' . filesize('catalog/view/theme/vista/js/jquery/jquery.validate.futura-methods.js'),
      'catalog/view/theme/vista/js/jquery/localization/messages_pt_BR.js?version=' . filesize('catalog/view/theme/vista/js/jquery/localization/messages_pt_BR.js')
    );

    $this->data['shippingAddressForm'] = $this->getChild('checkout/shipping_address/shippingAddressForm');

    $this->load->model('account/address');

    if ($this->config->get('listapresente_status')) {
      if (isset($this->session->data['cartxitem'])) {
        $this->data['cartxitens'] = $this->session->data['cartxitem'];
        $this->load->model('account/customer');
        $this->data['cartxitens']['cliente'] = $this->customer->getId();

        $this->data['addresses'] = $this->model_account_address->getAddresses($this->data['cartxitens']['cliente']);
      } else {
        $this->data['cartxitens'] = '';
        $this->data['addresses'] = $this->model_account_address->getAddresses();
      }
    } else {
      $this->data['addresses'] = $this->model_account_address->getAddresses();
    }

    $addresses_ids = array_map(function ($item){
      return $item['address_id'];
    }, $this->data['addresses']);

    if (
      isset($this->session->data['shipping_address_id']) &&
      in_array($this->session->data['shipping_address_id'], $addresses_ids)
    ) {
      $this->data['address_id'] = $this->session->data['shipping_address_id'];
    } else {
      $this->data['address_id'] = $this->customer->getAddressId();
    }

    if (isset($this->session->data['shipping_postcode'])) {
      $this->data['postcode'] = $this->session->data['shipping_postcode'];
    } else {
      $this->data['postcode'] = '';
    }

    $this->load->model('localisation/zone');
    $this->data['states'] = $this->model_localisation_zone->getZonesByCountryId(Type_PaisId::Tp_Brasil);

    $this->load->model('localisation/country');
    $this->data['countries'] = $this->model_localisation_country->getCountries();

    $this->response->setOutput($this->render('checkout/shipping_address'));
  }


  public function shippingAddressForm(){


    $this->app();

    $this->language->load('checkout/checkout');

    $this->data['text_checkout_shipping_address'] = $this->language->get('text_checkout_shipping_address');
    $this->data['text_shipping_address'] = $this->language->get('text_shipping_address');
    $this->data['text_select'] = $this->language->get('text_select');
    $this->data['text_none'] = $this->language->get('text_none');
    $this->data['entry_firstname'] = $this->language->get('entry_firstname');
    $this->data['entry_lastname'] = $this->language->get('entry_lastname');
    $this->data['entry_company'] = $this->language->get('entry_company');
    $this->data['entry_address_1'] = $this->language->get('entry_address_1');
    $this->data['entry_numero'] = $this->language->get('entry_numero');
    $this->data['entry_complemento'] = $this->language->get('entry_complemento');
    $this->data['entry_address_2'] = $this->language->get('entry_address_2');
    $this->data['entry_postcode'] = $this->language->get('entry_postcode');
    $this->data['entry_city'] = $this->language->get('entry_city');
    $this->data['entry_zone'] = $this->language->get('entry_zone');
    $this->data['button_continue'] = $this->language->get('button_continue');
    $this->data['entry_place'] = $this->language->get('entry_place');

    if (isset($this->request->post['zone_id'])) {
      $this->data['zone_id'] = $this->request->post['zone_id'];
    } elseif (isset($this->session->data['shipping_zone_id']) && ($this->session->data['shipping_zone_id'] != 'undefined') && ($this->session->data['shipping_zone_id'] != '')) {
      $this->data['zone_id'] = $this->session->data['shipping_zone_id'];
    } else {
      $this->data['zone_id'] = $this->config->get('config_zone_id');
    }

    $this->load->model('localisation/zone');
    $this->data['zone_name'] = $this->model_localisation_zone->getZone($this->data['zone_id'])['name'];


    $this->data['country_id'] = Type_PaisId::Tp_Brasil;

    $this->load->dmodel('localisation/ibge');
    $this->data['cities'] = $this->dmodel_localisation_ibge->getMunicipios($this->data['zone_id']);

    $this->load->model('localisation/zone');
    $this->data['states'] = $this->model_localisation_zone->getZonesByCountryId(Type_PaisId::Tp_Brasil);

    $this->response->setOutput($this->render('checkout/shipping_address_form'));

  }

  public function validate()
  {
    $this->language->load('checkout/checkout');

    $json = array();

    // Validate if customer is logged in.
    if (!$this->customer->isLogged()) {
      $json['redirect'] = $this->url->link('checkout/checkout', '', 'SSL');
    }

    // Validate if shipping is required. If not the customer should not have reached this page.
    if (!$this->cart->hasShipping()) {
      $json['redirect'] = $this->url->link('checkout/checkout', '', 'SSL');
    }

    // Validate cart has products and has stock.
    if ((!$this->cart->hasProducts() && empty($this->session->data['vouchers'])) || (!$this->cart->hasStock() && !$this->config->get('config_stock_checkout'))) {
      $json['redirect'] = $this->url->link('checkout/cart');
    }

    // Validate minimum quantity requirments.
    $products = $this->cart->getProducts();

    foreach ($products as $product) {
      $product_total = 0;

      foreach ($products as $product_2) {
        if ($product_2['product_id'] == $product['product_id']) {
          $product_total += $product_2['quantity'];
        }
      }

      if ($product['minimum'] > $product_total) {
        $json['redirect'] = $this->url->link('checkout/cart');

        break;
      }
    }

    if (!$json) {
      if (isset($this->request->post['shipping_address']) && $this->request->post['shipping_address'] == 'existing') {
        $this->load->model('account/address');


        if ($this->config->get('listapresente_status')) {
          if (empty($this->request->post['address_id'])) {
            $json['error']['warning'] = $this->language->get('error_address');
          }
        } else {
          if (empty($this->request->post['address_id'])) {
            $json['error']['warning'] = $this->language->get('error_address');
          } elseif (!in_array($this->request->post['address_id'], array_keys($this->model_account_address->getAddresses()))) {
            $json['error']['warning'] = $this->language->get('error_address');
          }
        }


        if (!$json) {
          $this->session->data['shipping_address_id'] = $this->request->post['address_id'];

          // Default Shipping Address
          $this->load->model('account/address');

          $address_info = $this->model_account_address->getAddress($this->request->post['address_id']);

          if ($address_info) {
            $this->session->data['shipping_country_id'] = $address_info['country_id'];
            $this->session->data['shipping_zone_id'] = $address_info['zone_id'];
            $this->session->data['shipping_postcode'] = $address_info['postcode'];
            $this->session->data['shipping_tipo_logradouro'] = $address_info['tipo_logradouro'];
            $this->session->data['shipping_logradouro'] = $address_info['logradouro'];
            $this->session->data['shipping_codigo_municipio'] = $address_info['codigo_municipio'];
          } else {
            unset($this->session->data['shipping_country_id']);
            unset($this->session->data['shipping_zone_id']);
            unset($this->session->data['shipping_postcode']);
            unset($this->session->data['shipping_tipo_logradouro']);
            unset($this->session->data['shipping_logradouro']);
            unset($this->session->data['shipping_codigo_municipio']);
          }

          unset($this->session->data['shipping_methods']);
        }
      }

      if ($this->request->post['shipping_address'] == 'new') {
        if ((utf8_strlen($this->request->post['firstname']) < 1) || (utf8_strlen($this->request->post['firstname']) > 32)) {
          $json['error']['firstname'] = $this->language->get('error_firstname');
        }

        if ((utf8_strlen($this->request->post['lastname']) < 1) || (utf8_strlen($this->request->post['lastname']) > 32)) {
          $json['error']['lastname'] = $this->language->get('error_lastname');
        }

        $numero = preg_replace('/([^0-9])/i', '', $this->request->post['numero']);
        if ((utf8_strlen($numero) < 1) || (utf8_strlen($numero) > 6)) {
          $json['error']['numero'] = 'Atenção: O número deve ter entre 1 e 6 caracteres!';
        }

        if ((utf8_strlen($this->request->post['address_1']) < 1) || (utf8_strlen($this->request->post['address_1']) > 70)) {
          $json['error']['address_1'] = $this->language->get('error_address_1');
        }

        if ((utf8_strlen($this->request->post['address_2']) < 1)) {
          $json['error']['address_2'] = $this->language->get('error_address_2');
        }


        if ((utf8_strlen($this->request->post['complemento']) > 0) && (utf8_strlen($this->request->post['complemento']) < 3) || (utf8_strlen($this->request->post['complemento']) > 60)) {
          $json['error']['complemento'] = $this->language->get('error_complemento');
        }

        if ((utf8_strlen($this->request->post['apelido']) > 0) && (utf8_strlen($this->request->post['apelido']) < 3) || (utf8_strlen($this->request->post['apelido']) > 80)) {
          $json['error']['apelido'] = $this->language->get('error_apelido');
        }

        if ((utf8_strlen($this->request->post['city']) < 2) || (utf8_strlen($this->request->post['city']) > 50)) {
          $json['error']['city'] = $this->language->get('error_city');
        }

        $this->load->model('localisation/country');

        $country_info = $this->model_localisation_country->getCountry($this->request->post['country_id']);

        if ($country_info && $country_info['postcode_required'] && (utf8_strlen($this->request->post['postcode']) < 2) || (utf8_strlen($this->request->post['postcode']) > 10)) {
          $json['error']['postcode'] = $this->language->get('error_postcode');
        }

        if ($this->request->post['country_id'] == '') {
          $json['error']['country'] = $this->language->get('error_country');
        }

        if (!isset($this->request->post['zone_id']) || $this->request->post['zone_id'] == '') {
          $json['error']['zone'] = $this->language->get('error_zone');
        }

        $this->load->model('account/address');
        if ($this->request->post['country_id'] <> $this->model_account_address->getCountryByZone($this->request->post['zone_id'])) {
          $this->request->post['zone_id'] = '';
          $json['error']['zone'] = $this->language->get('error_zone');
        }

        if (!$json) {
          // Default Shipping Address
          $this->load->model('account/address');

          if(isset($this->request->post['address_update_id'])){
            $this->model_account_address->editAddress($this->request->post['address_update_id'], $this->request->post);
            $this->session->data['shipping_address_id'] = $this->request->post['address_update_id'];
          }else{
            $this->session->data['shipping_address_id'] = $this->model_account_address->addAddress($this->request->post);
          }
          $this->session->data['shipping_country_id'] = $this->request->post['country_id'];
          $this->session->data['shipping_zone_id'] = $this->request->post['zone_id'];
          $this->session->data['shipping_postcode'] = $this->request->post['postcode'];

          unset($this->session->data['shipping_method']);
          unset($this->session->data['shipping_methods']);
        }
      }
    }

    if (isset($this->session->data['shipping_address_id'])) {
      $json['shipping_address_id'] = $this->session->data['shipping_address_id'];
    }


    $this->response->setOutput(json_encode($json));
  }

  private function app()
  {
    if ($this->ftrgeralregistry->isApp()) {
      $this->document->addScriptApp(array(
        'catalog/view/theme/appmobile/public/js/mainheaderform.js'
      ));

      $this->data['scriptsApp'] = json_encode($this->document->getScriptsApp());

      $this->data['dont_know_cep'] = $this->getChild('postcode/postcode');
    }
  }
}
