<?php

namespace App\Repositories;

use Str;
use App\User;
use stdClass;
use Validator;
use Carbon\Carbon;
use App\Models\UserAccount;
use App\Models\UserRegister;
use App\Models\PaymentMethod;
use App\Services\UserService;
use Illuminate\Support\Facades\Hash;

class UserRepository extends BaseRepository {


    public function __construct(User $model)
    {
        $this->model = $model;
    }



    public function update($data)
    {

        if($data['user_id'] === "new" || $data['user_id'] == 0){

            $this->model = User::create([
                'email' => $data['email'],
                'password' => env('APP_KEY'),
            ]);
            $this->model->payment_methods = PaymentMethod::getDefaultAsArray();
            $this->model->save();
        }
        else{
            $this->model = $this->getById($data['user_id']);
        }

        if(!$this->model->account_id){
            $account = new UserAccount();
        }else{
            $account = $this->model->account;
        }

        $data['same_as_billing'] = !isset($data['same_as_billing']) ? 0 : 1;

        $data['birthday_day'] = isset($data['birthday_day']) ? $data['birthday_day'] : 1;
        $data['birthday_month'] = isset($data['birthday_month']) ? $data['birthday_month'] : 1;
        $data['birthday_year'] = isset($data['birthday_year']) ? $data['birthday_year'] : 1900;
        $data['birthday'] =  $data['birthday_day'].".".$data['birthday_month'].".".$data['birthday_year']; 
        $data['birthday'] = $data['birthday'] == "1.1.1900" ? null : $data['birthday']; 
        
        $account->fill($data)->save();

        if(!$this->model->account_id){
            $this->model->account_id = $account->id;
            $this->model->save();
        }

        return true;
    }

    public function createUserRegister($data){

        $obj = new stdClass();

        $obj->email = $data['email'];
        $obj->password = Hash::make($data['password']);
        $obj->m_salutation = $data['salutation'];
        $obj->m_first_name = $data['first_name'];
        $obj->m_last_name = $data['last_name'];
        $obj->salutation = $data['salutation'];
        $obj->first_name = $data['first_name'];
        $obj->last_name = $data['last_name'];
        $obj->data_protection = now()->toDateTimeString();
       
        $obj->confirmation_code_to = date('Y-m-d H:i:s', strtotime('+1 week'));
        $obj->confirmation_code_remider = 0;
        $obj->m_sponsor = config('app.main_user_id');
        if(isset($data['from_member_id'])){
            $obj->m_sponsor = (int) str_replace('gs', '', $data['from_member_id']) - config('main.add_number_id');
        }
        $confirmation_code = UserService::createConfirmationCode();
        $obj->confirmation_code = $confirmation_code;
        UserRegister::create([
            'identifier' => $data['email'],
            'instance' => $confirmation_code,
            'content' => $obj
        ]);
        return $obj;
    }

    public function clearUserRegister(){
        $cleartime = date('Y-m-d H:i:s', strtotime('-1 day')); //gestern -24h
        UserRegister::where('created_at', '<', $cleartime)->delete();
    }

    public function create($UserRegister){

       
        $userObj = $UserRegister->content;

        $user = User::create([
            'email' => $userObj->email,
            'password' =>$userObj->password,
        ]);

        $account = UserAccount::create([
            'm_salutation' => $userObj->salutation,
            'm_first_name' => $userObj->first_name,
            'm_last_name' => $userObj->last_name,
            'salutation' => $userObj->salutation,
            'first_name' => $userObj->first_name,
            'last_name' => $userObj->last_name,
            'data_protection' => $userObj->data_protection,
        ]);
        $user->confirmed = 1;
        $user->confirmation_code = null;
        $user->confirmation_code_to = null;
        $user->confirmation_code_remider = 0;
        $user->confirmation_date = now();
        $user->lang = !empty(\App::getLocale()) ? \App::getLocale() : "de";
        $user->m_sponsor = $userObj->m_sponsor;

        $user->account_id = $account->id;
        $user->payment_methods = PaymentMethod::getDefaultAsArray();

        $user->save();
        
        $user = User::find($user->id);

        //clear
        $identifier = $UserRegister->identifier;
        UserRegister::where('identifier', $identifier)->delete();

        return $user;
    }

    public function deleteUser(User $user)
    {
        if($user->account){
            $user->account->delete();
        }
        $user->email = "delete".time();
        $user->password = "delete".time();
        $user->confirmed = 0;
        $user->confirmation_code = "delete".time();
        $user->confirmation_date = null;
        $user->confirmation_code_to = null;
        $user->confirmation_code_remider = 2;
        $user->agreement = null;
        $user->active = 0;
        $user->remember_token = '';
        $user->active_date = null;
        $user->admin = 0;
        $user->deleted_at = now();
        $user->save();

        return true;
    }

    public function reverse_charge_validate($data, $user, $route){

        if(isset($data['action']) && $data['action'] == 'reverse_charge_validate'){
            $rules = array(
                'tax_identification_number' => 'required',
            );
            $validator = Validator::make($data, $rules);
            if ($validator->fails()) {
                $data = [
                    'user' => $user,
                ];
                return redirect($route)->withErrors($validator)->withInput($data);
            }    
            $ret = $this->reverse_charge_activate($data, $user);
            if($ret === 'error'){
                $validator = Validator::make($data, []);
                $validator->errors()->add('tax_identification_number_validated', __('msg.VATID_could_not_be_validated'));
                $data['reverse_charge'] = 0;
                $data = [
                    'user' => $user,
                ];
                return redirect($route.'#user-vat-validation')->withErrors($validator)->withInput($data);
            }
            if($ret === 'valid'){
                \Session()->flash('alert-success', __('msg.VATID_successfully_entered'));
                return redirect($route.'#user-vat-validation')->withInput($data);

                return redirect($route.'#user-vat-validation')->withInput($data);
            }
        }
    }

    public function reverse_charge_delete($data, $user, $route){
        if(isset($data['action']) && $data['action'] == 'reverse_charge_delete'){
            $user->account->tax_identification_number = '';
            $user->account->reverse_charge = 0;
            $user->account->reverse_charge_code  = null;
            $user->account->reverse_charge_valid = null;
            $user->account->save();
            $data['tax_identification_number'] = '';
            \Session()->flash('alert-success', __('msg.reverse_charge_procedure_and_VATID_deleted'));
            return redirect($route.'#user-vat-validation')->withInput($data);
        }
    }

    public function reverse_charge_activate($data, $user){

        /* 'AT' => 'AT-Oesterreich',
         'BE' => 'BE-Belgien',
         'BG' => 'BG-Bulgarien',
         'CY' => 'CY-Zypern',
         'CZ' => 'CZ-Tschechische Republik',
         'DE' => 'DE-Deutschland',
         'DK' => 'DK-Dänemark',
         'EE' => 'EE-Estland',
         'EL' => 'EL-Griechenland',
         'ES' => 'ES-Spanien',
         'FI' => 'FI-Finnland',
         'FR' => 'FR-Frankreich ',
         'HR' => 'HR-Kroatien ',
         'HU' => 'HU-Ungarn',
         'IE' => 'IE-Irland',
         'IT' => 'IT-Italien',
         'LT' => 'LT-Litauen',
         'LU' => 'LU-Luxemburg',
         'LV' => 'LV-Lettland',
         'MT' => 'MT-Malta',
         'NL' => 'NL-Niederlande',
         'PL' => 'PL-Polen',
         'PT' => 'PT-Portugal',
         'RO' => 'RO-Rumänien',
         'SE' => 'SE-Schweden',
         'SI' => 'SI-Slowenien',
         'SK' => 'SK-Slowakei',
         'XI' => 'XI-Nordirland', */
         $countryCode = 'DE';       
 
         if($user->account->country_id){
             $countryCode = $user->account->country->code;
         }
 
         $vatid = str_replace(array(' ', '.', '-', ',', ', '), '', trim($data['tax_identification_number']));
         $cc = substr($vatid, 0, 2);
         $vatNo = substr($vatid, 2);
 
         $options = [
             'cache_wsdl'     => WSDL_CACHE_NONE,
             'trace'          => 1,
             'stream_context' => stream_context_create(
                 [
                     'ssl' => [
                         'verify_peer'       => false,
                         'verify_peer_name'  => false,
                         'allow_self_signed' => true
                     ]
                 ]
             )
         ];
 
         $client = new \SoapClient("https://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl", $options);
         $result = $client->checkVat(['countryCode' => $countryCode, 'vatNumber' => $vatNo]);
 
         if($result->valid == true) {
             $user->account->tax_identification_number = $data['tax_identification_number'];
             $user->account->reverse_charge = 1;
             $user->account->reverse_charge_code = $countryCode;
             $user->account->reverse_charge_valid = now();
             $user->account->save();
             return 'valid';
         } else {
             return 'error';
         }
     }


}