<?php
class ControllerCheckoutGuest extends Controller {
  public function index() {
    $this->language->load('checkout/checkout');

    $this->data['text_select']          = $this->language->get('text_select');
    $this->data['text_none']            = $this->language->get('text_none');
    $this->data['text_your_details']    = $this->language->get('text_your_details');
    $this->data['text_your_account']    = $this->language->get('text_your_account');
    $this->data['text_your_address']    = $this->language->get('text_your_address');
    $this->data['entry_firstname']      = $this->language->get('entry_firstname');
    $this->data['entry_lastname']       = $this->language->get('entry_lastname');
    $this->data['entry_email']          = $this->language->get('entry_email');
    $this->data['entry_telephone']      = $this->language->get('entry_telephone');
    $this->data['entry_fax']            = $this->language->get('entry_fax');
    $this->data['entry_company']        = $this->language->get('entry_company');
    $this->data['entry_customer_group'] = $this->language->get('entry_customer_group');
    $this->data['entry_company_id']     = $this->language->get('entry_company_id');
    $this->data['entry_address_1']      = $this->language->get('entry_address_1');
    $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['entry_shipping']       = $this->language->get('entry_shipping');
    $this->data['button_continue']      = $this->language->get('button_continue');

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

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

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

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

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

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

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

    if (isset($this->session->data['guest']['cpf'])) {
      $this->data['cpf'] = preg_replace('/([^0-9])/i','',$this->session->data['guest']['cpf']);
    } else {
      $this->data['cpf'] = '';
    }

    if (isset($this->session->data['guest']['rg'])) {
      $this->data['rg'] = preg_replace('/([^0-9])/i','',$this->session->data['guest']['rg']);
    } else {
      $this->data['rg'] = '';
    }

    if (isset($this->session->data['guest']['cnpj'])) {
      $this->data['cnpj'] = preg_replace('/([^0-9])/i','',$this->session->data['guest']['cnpj']);
    } else {
      $this->data['cnpj'] = '';
    }

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

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

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

    if (isset($this->session->data['guest']['payment']['apelido'])) {
      $this->data['apelido'] = $this->session->data['guest']['payment']['apelido'];
    } else {
      $this->data['apelido'] = '';
    }

    if (isset($this->session->data['guest']['payment']['address_1'])) {
      $this->data['address_1'] = $this->session->data['guest']['payment']['address_1'];
    } else {
      $this->data['address_1'] = '';
    }

    if (isset($this->session->data['guest']['payment']['numero'])) {
      $this->data['numero'] = $this->session->data['guest']['payment']['numero'];
    } else {
      $this->data['numero'] = '';
    }

    if (isset($this->session->data['guest']['payment']['address_2'])) {
      $this->data['address_2'] = $this->session->data['guest']['payment']['address_2'];
    } else {
      $this->data['address_2'] = '';
    }

    if (isset($this->session->data['guest']['payment']['complemento'])) {
      $this->data['complemento'] = $this->session->data['guest']['payment']['complemento'];
    } else {
      $this->data['complemento'] = '';
    }

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

    if (isset($this->session->data['guest']['payment']['city'])) {
      $this->data['city'] = $this->session->data['guest']['payment']['city'];
    } else {
      $this->data['city'] = '';
    }

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

    if (isset($this->session->data['guest']['payment']['zone_id'])) {
      $this->data['zone_id'] = $this->session->data['guest']['payment']['zone_id'];
    } elseif (isset($this->session->data['shipping_zone_id'])) {
      $this->data['zone_id'] = $this->session->data['shipping_zone_id'];
    } else {
      $this->data['zone_id'] = '';
    }

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

    $this->data['countries'] = $this->model_localisation_country->getCountries();

    $this->data['shipping_required'] = $this->cart->hasShipping();

    if (isset($this->session->data['guest']['shipping_address'])) {
      $this->data['shipping_address'] = $this->session->data['guest']['shipping_address'];
    } else {
      $this->data['shipping_address'] = true;
    }

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


  public function isCpf($cpf){
    $cpf        = preg_replace('/([^0-9])/i','',$cpf);
    $digitoUm   = 0;
    $digitoDois = 0;

    for($i = 0, $x = 10; $i <= 8; $i++, $x--){
      $digitoUm += $cpf[$i] * $x;
    }

    for($i = 0, $x = 11; $i <= 9; $i++, $x--){
      if(str_repeat($i, 11) == $cpf){
        return false;
      }
      $digitoDois += $cpf[$i] * $x;
    }

    $calculoUm   = (($digitoUm % 11) < 2) ? 0 : 11 - ($digitoUm % 11);
    $calculoDois = (($digitoDois % 11) < 2) ? 0 : 11 - ($digitoDois % 11);

    if($calculoUm != $cpf[9] || $calculoDois != $cpf[10]){
      return false;
    }

    return true;
  }

  public function isCnpj($cnpj){
    $cnpj = str_pad(str_replace(array('.','-','/'),'',$cnpj),14,'0',STR_PAD_LEFT);

    if($cnpj == '00000000000000'){
      return false;
    }

    if (strlen($cnpj) != 14){
      return false;
    }else{
      for($t = 12; $t < 14; $t++){
        for($d = 0, $p = $t - 7, $c = 0; $c < $t; $c++){
          $d += $cnpj{$c} * $p;
          $p  = ($p < 3) ? 9 : --$p;
        }
        $d = ((10 * $d) % 11) % 10;
        if($cnpj{$c} != $d){
          return false;
        }
      }
      return true;
    }
  }


  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 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');
    }

    // Check if guest checkout is avaliable.
    if (!$this->config->get('config_guest_checkout') || $this->config->get('config_customer_price') || $this->cart->hasDownload()) {
      $json['redirect'] = $this->url->link('checkout/checkout', '', 'SSL');
    }

    if (!$json) {
      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');
      }

      if ((utf8_strlen($this->request->post['email']) > 96) || !preg_match('/^[^\@]+@.*\.[a-z]{2,6}$/i', $this->request->post['email'])) {
        $json['error']['email'] = $this->language->get('error_email');
      }

      // Valida campo Data de Nascimento
      $dataparts = explode("/",$this->request->post['data_nascimento']);
      if (strlen(utf8_decode($this->request->post['data_nascimento'])) > 0) {
        // Se o array não tiver 3 posições a data esta incorreta
        if (sizeof($dataparts) != '3'){
          $json['error']['data_nascimento']  = "Atenção: A data informada é inválida";
        }else{
          // Checa validade da data
          if (!checkdate($dataparts[1],$dataparts[0],$dataparts[2])) {
            $json['error']['data_nascimento'] = "Atenção: A data informada é inválida";
          }
        }
      }

      // Valida CPF e CNPJ
      if ($this->request->post['pessoa'] == "F"){
        if(isset($this->request->post['cpf'])){
          $cpf = preg_replace('/([^0-9])/i','',$this->request->post['cpf']);
          if ((strlen(utf8_decode($cpf)) < 1) || (strlen(utf8_decode($cpf)) > 14)) {
            $json['error']['cpf'] = "Atenção: O CPF não deve passar de 14 caracteres";
          }elseif(!$this->isCpf($cpf)){
            $json['error']['cpf'] = "Atenção: O CPF informado é inválido";
          }
        }
      }else if ($this->request->post['pessoa'] == "J"){
        if(isset($this->request->post['cnpj'])){
          $cnpj = preg_replace('/([^0-9])/i','',$this->request->post['cnpj']);
          if ((strlen(utf8_decode($cnpj)) < 1) || (strlen(utf8_decode($cnpj)) > 18)&&($this->request->post['pessoa'] == "J")) {
            $json['error']['cnpj'] =  "Atenção: O CNPJ não deve passar de 18 caracteres";
          }elseif(!$this->isCnpj($cnpj)){
            $json['error']['cnpj'] = "Atenção: O CNPJ informado é inválido";
          }
        }

        if($this->request->post['razao_social'] == ''){
          $this->error['razao_social'] = "Por favor, informe a razao social da empresa!";
        }
      }



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

      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');
      }

      $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['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) {
        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');
        }

        // VAT Validation
        $this->load->helper('vat');

      }

      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) {
      $this->session->data['guest']['firstname']              = $this->request->post['firstname'];
      $this->session->data['guest']['lastname']               = $this->request->post['lastname'];
      $this->session->data['guest']['email']                  = $this->request->post['email'];
      $this->session->data['guest']['telephone']              = $this->request->post['telephone'];
      $this->session->data['guest']['fax']                    = $this->request->post['fax'];
      $this->session->data['guest']['pessoa']                 = $this->request->post['pessoa'];
      $this->session->data['guest']['sexo']                   = $this->request->post['sexo'];
      $this->session->data['guest']['data_nascimento']        = $this->request->post['data_nascimento'];
      $this->session->data['guest']['cpf']                    = $this->request->post['cpf'];
      $this->session->data['guest']['rg']                     = $this->request->post['rg'];
      $this->session->data['guest']['cnpj']                   = $this->request->post['cnpj'];
      $this->session->data['guest']['razao_social']           = $this->request->post['razao_social'];
      $this->session->data['guest']['inscricao_estadual']     = $this->request->post['inscricao_estadual'];
      $this->session->data['guest']['payment']['firstname']   = $this->request->post['firstname'];
      $this->session->data['guest']['payment']['lastname']    = $this->request->post['lastname'];
      $this->session->data['guest']['payment']['company']     = $this->request->post['company'];
      $this->session->data['guest']['payment']['apelido']     = $this->request->post['apelido'];
      $this->session->data['guest']['payment']['company_id']  = $this->request->post['company_id'];
      $this->session->data['guest']['payment']['address_1']   = $this->request->post['address_1'];
      $this->session->data['guest']['payment']['address_2']   = $this->request->post['address_2'];
      $this->session->data['guest']['payment']['complemento'] = $this->request->post['complemento'];
      $this->session->data['guest']['payment']['numero']      = $this->request->post['numero'];
      $this->session->data['guest']['payment']['postcode']    = $this->request->post['postcode'];
      $this->session->data['guest']['payment']['city']        = $this->request->post['city'];
      $this->session->data['guest']['payment']['country_id']  = $this->request->post['country_id'];
      $this->session->data['guest']['payment']['zone_id']     = $this->request->post['zone_id'];

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

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

      if ($country_info) {
        $this->session->data['guest']['payment']['country']        = $country_info['name'];
        $this->session->data['guest']['payment']['iso_code_2']     = $country_info['iso_code_2'];
        $this->session->data['guest']['payment']['iso_code_3']     = $country_info['iso_code_3'];
        $this->session->data['guest']['payment']['address_format'] = $country_info['address_format'];
      } else {
        $this->session->data['guest']['payment']['country']        = '';
        $this->session->data['guest']['payment']['iso_code_2']     = '';
        $this->session->data['guest']['payment']['iso_code_3']     = '';
        $this->session->data['guest']['payment']['address_format'] = '';
      }

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

      $zone_info = $this->model_localisation_zone->getZone($this->request->post['zone_id']);

      if ($zone_info) {
        $this->session->data['guest']['payment']['zone']      = $zone_info['name'];
        $this->session->data['guest']['payment']['zone_code'] = $zone_info['code'];
      } else {
        $this->session->data['guest']['payment']['zone']      = '';
        $this->session->data['guest']['payment']['zone_code'] = '';
      }

      if (!empty($this->request->post['shipping_address'])) {
        $this->session->data['guest']['shipping_address'] = true;
      } else {
        $this->session->data['guest']['shipping_address'] = false;
      }

      // Default Payment Address
      $this->session->data['payment_country_id'] = $this->request->post['country_id'];
      $this->session->data['payment_zone_id'] = $this->request->post['zone_id'];

      if ($this->session->data['guest']['shipping_address']) {
        $this->session->data['guest']['shipping']['firstname']   = $this->request->post['firstname'];
        $this->session->data['guest']['shipping']['lastname']    = $this->request->post['lastname'];
        $this->session->data['guest']['shipping']['company']     = $this->request->post['company'];
        $this->session->data['guest']['shipping']['apelido']     = $this->request->post['apelido'];
        $this->session->data['guest']['shipping']['address_1']   = $this->request->post['address_1'];
        $this->session->data['guest']['shipping']['address_2']   = $this->request->post['address_2'];
        $this->session->data['guest']['shipping']['complemento'] = $this->request->post['complemento'];
        $this->session->data['guest']['shipping']['numero']      = $this->request->post['numero'];
        $this->session->data['guest']['shipping']['postcode']    = $this->request->post['postcode'];
        $this->session->data['guest']['shipping']['city']        = $this->request->post['city'];
        $this->session->data['guest']['shipping']['country_id']  = $this->request->post['country_id'];
        $this->session->data['guest']['shipping']['zone_id']     = $this->request->post['zone_id'];

        if ($country_info) {
          $this->session->data['guest']['shipping']['country']        = $country_info['name'];
          $this->session->data['guest']['shipping']['iso_code_2']     = $country_info['iso_code_2'];
          $this->session->data['guest']['shipping']['iso_code_3']     = $country_info['iso_code_3'];
          $this->session->data['guest']['shipping']['address_format'] = $country_info['address_format'];
        } else {
          $this->session->data['guest']['shipping']['country']        = '';
          $this->session->data['guest']['shipping']['iso_code_2']     = '';
          $this->session->data['guest']['shipping']['iso_code_3']     = '';
          $this->session->data['guest']['shipping']['address_format'] = '';
        }

        if ($zone_info) {
          $this->session->data['guest']['shipping']['zone']      = $zone_info['name'];
          $this->session->data['guest']['shipping']['zone_code'] = $zone_info['code'];
        } else {
          $this->session->data['guest']['shipping']['zone']      = '';
          $this->session->data['guest']['shipping']['zone_code'] = '';
        }

        // Default Shipping Address
        $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'];
      }

      $this->session->data['account'] = 'guest';

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

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

  public function zone() {
    $output = '<option value="">' . $this->language->get('text_select') . '</option>';

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

    $results = $this->model_localisation_zone->getZonesByCountryId($this->request->get['country_id']);

    foreach ($results as $result) {
      $output .= '<option value="' . $result['zone_id'] . '"';

      if (isset($this->request->get['zone_id']) && ($this->request->get['zone_id'] == $result['zone_id'])) {
        $output .= ' selected="selected"';
      }

      $output .= '>' . $result['name'] . '</option>';
    }

    if (!$results) {
      $output .= '<option value="0">' . $this->language->get('text_none') . '</option>';
    }

    $this->response->setOutput($output);
  }
}
