<?php

class ControllerFidelityPaymentAddress extends Controller
{
  public function index()
  {
    $this->language->load('fidelity/checkout');

    $this->data['text_checkout_payment_address'] = $this->language->get('text_checkout_payment_address');
    $this->data['text_payment_address'] = $this->language->get('text_payment_address');
    $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_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_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_country'] = $this->language->get('entry_country');
    $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['address_id'] = $this->customer->getAddressId();
    $this->data['addresses'] = array();

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

    $this->data['addresses'] = $this->model_account_address->getAddresses();

    if (isset($this->session->data['payment_country_id'])) {
      $this->data['country_id'] = $this->session->data['payment_country_id'];
    } else {
      $this->data['country_id'] = Type_PaisId::Tp_Brasil;
    }

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

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

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

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

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

    $json = array();

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

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

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

        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');
        } else {
          // Default Payment Address
          $this->load->model('account/address');

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

          if ($address_info) {
            $this->load->model('account/customer_group');

            $customer_group_info = $this->model_account_customer_group->getCustomerGroup($this->customer->getCustomerGroupId());
          }
        }

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

          if ($address_info) {
            $this->session->data['payment_country_id'] = $address_info['country_id'];
            $this->session->data['payment_zone_id'] = $address_info['zone_id'];
            $this->session->data['payment_tipo_logradouro'] = $address_info['tipo_logradouro'];
            $this->session->data['payment_logradouro'] = $address_info['logradouro'];
            $this->session->data['payment_codigo_municipio'] = $address_info['codigo_municipio'];
          } else {
            unset($this->session->data['payment_country_id']);
            unset($this->session->data['payment_zone_id']);
            unset($this->session->data['payment_tipo_logradouro']);
            unset($this->session->data['payment_logradouro']);
            unset($this->session->data['payment_codigo_municipio']);
          }

          unset($this->session->data['payment_method']);
          unset($this->session->data['payment_methods']);
        }
      } else {
        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');
        }

        // Customer Group
        $this->load->model('account/customer_group');

        $customer_group_info = $this->model_account_customer_group->getCustomerGroup($this->customer->getCustomerGroupId());

        $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']) < 3) || (utf8_strlen($this->request->post['address_1']) > 70)) {
          $json['error']['address_1'] = $this->language->get('error_address_1');
        }

        if ((utf8_strlen($this->request->post['city']) < 2) || (utf8_strlen($this->request->post['city']) > 32)) {
          $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) {
          if ($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 Payment Address
          $this->load->model('account/address');

          $this->session->data['payment_address_id'] = $this->model_account_address->addAddress($this->request->post);
          $this->session->data['payment_country_id'] = $this->request->post['country_id'];
          $this->session->data['payment_zone_id'] = $this->request->post['zone_id'];

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

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