<?php
/**
 * Wiaas_Customer_Test
 *
 * @package Wiaas
 */

class Wiass_REST_Customer_Api_Test extends Wiaas_Unit_Test_Case {

	protected $server;

	function setUp() {
		parent::setUp();

		/** @var WP_REST_Server $wp_rest_server */
		global $wp_rest_server;
		$this->server = $wp_rest_server = new \WP_REST_Server;
		do_action( 'rest_api_init' );
	}

	/**
	 * @covers Wiass_REST_Customer_API::update_customer_profile_addresses
	 */
	function test_update_customer_profile_addresses_as_guest() {
        wp_set_current_user(0);
        
        $dummy_address = self::create_dummy_address();

        $request = new WP_REST_Request( 'PUT', '/wiaas/customer/0/profile-addresses');
        $request->set_body_params(array(
            'profile_address' => $dummy_address
        ));
		$response = $this->server->dispatch( $request );

		$this->assertNotNull($response);
		$this->assertInstanceOf('WP_REST_Response',$response);
		$this->assertTrue($response->is_error());
		$this->assertEquals($response->get_status(), 401);

		$error_data = $response->as_error();
		$this->assertEquals($error_data->get_error_message(), 'Sorry, you are not allowed to do that.');
    }
    
    /**
	 * @covers Wiass_REST_Customer_API::update_customer_profile_addresses
	 */
	function test_add_customer_profile_addresses_with_valid_address() {
        wp_set_current_user(1);
        
        $dummy_address = self::create_dummy_address();

        $request = new WP_REST_Request( 'PUT', '/wiaas/customer/1/profile-addresses');
        $request->set_body_params(array(
            'profile_address' => json_encode($dummy_address)
        ));
        $response = $this->server->dispatch( $request );

		$this->assertNotNull($response);
		$this->assertInstanceOf('WP_REST_Response',$response);
		$this->assertFalse($response->is_error());
		$this->assertEquals($response->get_status(), 200);

		$data = $response->get_data();
        $this->assertArrayHasKey('data', $data);
        $this->assertArrayHasKey('messages', $data);

        $profile_info = $data['data'];
        $messages = $data['messages'][0];

        $this->assertArrayHasKey('profile_addresses', $profile_info);
        $this->assertEquals($profile_info['profile_addresses'][0]['city'], $dummy_address['city']);

        $this->assertArrayHasKey('message', $messages);
        $this->assertEquals($messages['message'], 'PROFILE_ADDRESS_UPDATED');
    }

    /**
	 * @covers Wiass_REST_Customer_API::update_customer_profile_addresses
	 */
	function test_add_customer_profile_addresses_with_invalid_address() {
        wp_set_current_user(1);
        
        $dummy_address = self::create_dummy_address();
        $dummy_address['zip_code'] = 'this is not a zip code';

        $request = new WP_REST_Request( 'PUT', '/wiaas/customer/1/profile-addresses');
        $request->set_body_params(array(
            'profile_address' => json_encode($dummy_address)
        ));
        $response = $this->server->dispatch( $request );

		$this->assertNotNull($response);
		$this->assertInstanceOf('WP_REST_Response',$response);
		$this->assertFalse($response->is_error());
		$this->assertEquals($response->get_status(), 200);

		$data = $response->get_data();
        $this->assertArrayHasKey('data', $data);
        $this->assertArrayHasKey('messages', $data);

        $profile_info = $data['data'];
        $messages = $data['messages'][0];

        $this->assertArrayHasKey('profile_addresses', $profile_info);
        $this->assertEquals($profile_info['profile_addresses'][0], NULL);

        $this->assertArrayHasKey('message', $messages);
        $this->assertEquals($messages['message'], 'PROFILE_ADDRESS_NOT_CHANGED');
    }

    /**
	 * @covers Wiass_REST_Customer_API::update_customer_billing_addresses
	 */
	function test_update_customer_billing_addresses_as_guest() {
        wp_set_current_user(0);
        
        $dummy_address = self::create_dummy_address();

        $request = new WP_REST_Request( 'PUT', '/wiaas/customer/0/billing-addresses');
        $request->set_body_params(array(
            'billing_address' => $dummy_address
        ));
		$response = $this->server->dispatch( $request );

		$this->assertNotNull($response);
		$this->assertInstanceOf('WP_REST_Response',$response);
		$this->assertTrue($response->is_error());
		$this->assertEquals($response->get_status(), 401);

		$error_data = $response->as_error();
		$this->assertEquals($error_data->get_error_message(), 'Sorry, you are not allowed to do that.');
    }
    
    /**
	 * @covers Wiass_REST_Customer_API::update_customer_billing_addresses
	 */
	function test_add_customer_billing_addresses_with_valid_address() {
        wp_set_current_user(1);
        
        $dummy_address = self::create_dummy_address();

        $request = new WP_REST_Request( 'PUT', '/wiaas/customer/1/billing-addresses');
        $request->set_body_params(array(
            'billing_address' => json_encode($dummy_address)
        ));
        $response = $this->server->dispatch( $request );

		$this->assertNotNull($response);
		$this->assertInstanceOf('WP_REST_Response',$response);
		$this->assertFalse($response->is_error());
		$this->assertEquals($response->get_status(), 200);

		$data = $response->get_data();
        $this->assertArrayHasKey('data', $data);
        $this->assertArrayHasKey('messages', $data);

        $profile_info = $data['data'];
        $messages = $data['messages'][0];

        $this->assertArrayHasKey('billing_addresses', $profile_info);
        $this->assertEquals($profile_info['billing_addresses'][0]['city'], $dummy_address['city']);

        $this->assertArrayHasKey('message', $messages);
        $this->assertEquals($messages['message'], 'BILLING_ADDRESS_UPDATED');
    }

    /**
	 * @covers Wiass_REST_Customer_API::update_customer_billing_addresses
	 */
	function test_add_customer_billing_addresses_with_invalid_address() {
        wp_set_current_user(1);
        
        $dummy_address = self::create_dummy_address();
        $dummy_address['zip_code'] = 'this is not a zip code';

        $request = new WP_REST_Request( 'PUT', '/wiaas/customer/1/billing-addresses');
        $request->set_body_params(array(
            'billing_address' => json_encode($dummy_address)
        ));
        $response = $this->server->dispatch( $request );

		$this->assertNotNull($response);
		$this->assertInstanceOf('WP_REST_Response',$response);
		$this->assertFalse($response->is_error());
		$this->assertEquals($response->get_status(), 200);

		$data = $response->get_data();
        $this->assertArrayHasKey('data', $data);
        $this->assertArrayHasKey('messages', $data);

        $profile_info = $data['data'];
        $messages = $data['messages'][0];

        $this->assertArrayHasKey('billing_addresses', $profile_info);
        $this->assertEquals($profile_info['billing_addresses'][0], NULL);

        $this->assertArrayHasKey('message', $messages);
        $this->assertEquals($messages['message'], 'BILLING_ADDRESS_NOT_CHANGED');
    }
    
    /**
	 * @covers Wiass_REST_Customer_API::delete_customer_billing_addresses
	 */
	function test_delete_customer_billing_addresses_as_guest() {
        $address_id = self::insert_dummy_billing_address();
        wp_set_current_user(0);

        $request = new WP_REST_Request( 'DELETE', '/wiaas/customer/1/billing-addresses/' . $address_id);
        $response = $this->server->dispatch( $request );

		$this->assertNotNull($response);
		$this->assertInstanceOf('WP_REST_Response',$response);
		$this->assertTrue($response->is_error());
		$this->assertEquals($response->get_status(), 401);

		$error_data = $response->as_error();
		$this->assertEquals($error_data->get_error_message(), 'Sorry, you are not allowed to do that.');
    }

    /**
	 * @covers Wiass_REST_Customer_API::delete_customer_billing_addresses
	 */
	function test_delete_customer_billing_addresses() {
        $address_id = self::insert_dummy_billing_address();
        wp_set_current_user(1);

        $request = new WP_REST_Request( 'DELETE', '/wiaas/customer/1/billing-addresses/' . $address_id);
        $response = $this->server->dispatch( $request );

		$this->assertNotNull($response);
		$this->assertInstanceOf('WP_REST_Response',$response);
		$this->assertFalse($response->is_error());
        $this->assertEquals($response->get_status(), 200);
        
        $data = $response->get_data();
        
        $this->assertArrayHasKey('data', $data);
        $this->assertArrayHasKey('messages', $data);

        $profile_info = $data['data'];
        $messages = $data['messages'][0];

        $this->assertArrayHasKey('billing_addresses', $profile_info);
        $this->assertEquals($profile_info['billing_addresses'][0], NULL);

        $this->assertArrayHasKey('message', $messages);
        $this->assertEquals($messages['message'], 'ADDRESS_REMOVED');
    }

    /**
	 * @covers Wiass_REST_Customer_API::delete_customer_profile_addresses
	 */
	function test_delete_customer_delivery_addresses_as_guest() {
        $address_id = self::insert_dummy_profile_address();
        wp_set_current_user(0);

        $request = new WP_REST_Request( 'DELETE', '/wiaas/customer/1/profile-addresses/' . $address_id);
        $response = $this->server->dispatch( $request );

		$this->assertNotNull($response);
		$this->assertInstanceOf('WP_REST_Response',$response);
		$this->assertTrue($response->is_error());
		$this->assertEquals($response->get_status(), 401);

		$error_data = $response->as_error();
		$this->assertEquals($error_data->get_error_message(), 'Sorry, you are not allowed to do that.');
    }

    /**
	 * @covers Wiass_REST_Customer_API::delete_customer_profile_addresses
	 */
	function test_delete_customer_profile_addresses() {
        $address_id = self::insert_dummy_profile_address();
        wp_set_current_user(1);

        $request = new WP_REST_Request( 'DELETE', '/wiaas/customer/1/profile-addresses/' . $address_id);
        $response = $this->server->dispatch( $request );

		$this->assertNotNull($response);
		$this->assertInstanceOf('WP_REST_Response',$response);
		$this->assertFalse($response->is_error());
        $this->assertEquals($response->get_status(), 200);
        
        $data = $response->get_data();
        
        $this->assertArrayHasKey('data', $data);
        $this->assertArrayHasKey('messages', $data);

        $profile_info = $data['data'];
        $messages = $data['messages'][0];

        $this->assertArrayHasKey('profile_addresses', $profile_info);
        $this->assertEquals($profile_info['profile_addresses'][0], NULL);

        $this->assertArrayHasKey('message', $messages);
        $this->assertEquals($messages['message'], 'ADDRESS_REMOVED');
    }

    /**
	 * @covers Wiass_REST_Customer_API::update_customer_personal_info
	 */
	function test_update_customer_personal_info_as_guest() {
        wp_set_current_user(0);

        $request = new WP_REST_Request( 'PUT', '/wiaas/customer/1/personal-info');
        $request->set_body_params(array(
            'first_name' => 'Trunks',
            'last_name' => 'Goten',
            'phone' => 11111
        ));
		$response = $this->server->dispatch( $request );

		$this->assertNotNull($response);
		$this->assertInstanceOf('WP_REST_Response',$response);
		$this->assertTrue($response->is_error());
		$this->assertEquals($response->get_status(), 401);

		$error_data = $response->as_error();
		$this->assertEquals($error_data->get_error_message(), 'Sorry, you are not allowed to do that.');
    }

    /**
	 * @covers Wiass_REST_Customer_API::update_customer_personal_info
	 */
	function test_update_customer_personal_info_with_empty_phone() {
        wp_set_current_user(1);

        $request = new WP_REST_Request( 'PUT', '/wiaas/customer/1/personal-info');
        $request->set_body_params(array(
            'first_name' => 'Trunks',
            'last_name' => 'Goten',
            'phone' => ''
        ));
        $response = $this->server->dispatch( $request );

		$this->assertNotNull($response);
		$this->assertInstanceOf('WP_REST_Response',$response);
		$this->assertFalse($response->is_error());
        $this->assertEquals($response->get_status(), 200);
        
        $data = $response->get_data();
        
        $this->assertArrayHasKey('data', $data);
        $this->assertArrayHasKey('messages', $data);

        $profile_info = $data['data'];
        $messages = $data['messages'][0];

        $this->assertArrayHasKey('phone', $profile_info);
        $this->assertEquals($profile_info['phone'], '');

        $this->assertArrayHasKey('message', $messages);
        $this->assertEquals($messages['message'], 'ADD_PHONE_NUMBER');
    }

    /**
	 * @covers Wiass_REST_Customer_API::update_customer_personal_info
	 */
	function test_update_customer_personal_info_with_empty_name() {
        wp_set_current_user(1);

        $request = new WP_REST_Request( 'PUT', '/wiaas/customer/1/personal-info');
        $request->set_body_params(array(
            'first_name' => '',
            'last_name' => '',
            'phone' => '23232'
        ));
        $response = $this->server->dispatch( $request );

		$this->assertNotNull($response);
		$this->assertInstanceOf('WP_REST_Response',$response);
		$this->assertFalse($response->is_error());
        $this->assertEquals($response->get_status(), 200);
        
        $data = $response->get_data();
        
        $this->assertArrayHasKey('data', $data);
        $this->assertArrayHasKey('messages', $data);

        $profile_info = $data['data'];
        $messages = $data['messages'][0];

        $this->assertArrayHasKey('phone', $profile_info);
        $this->assertEquals($profile_info['phone'], '');

        $this->assertArrayHasKey('message', $messages);
        $this->assertEquals($messages['message'], 'ADD_NAME');
    }

    /**
	 * @covers Wiass_REST_Customer_API::update_customer_personal_info
	 */
	function test_update_customer_personal_info() {
        wp_set_current_user(1);

        $request = new WP_REST_Request( 'PUT', '/wiaas/customer/1/personal-info');
        $request->set_body_params(array(
            'first_name' => 'Trunks',
            'last_name' => 'Goten',
            'phone' => '3434'
        ));
        $response = $this->server->dispatch( $request );

		$this->assertNotNull($response);
		$this->assertInstanceOf('WP_REST_Response',$response);
		$this->assertFalse($response->is_error());
        $this->assertEquals($response->get_status(), 200);
        
        $data = $response->get_data();
        
        $this->assertArrayHasKey('data', $data);
        $this->assertArrayHasKey('messages', $data);

        $profile_info = $data['data'];
        $messages = $data['messages'][0];

        $this->assertArrayHasKey('phone', $profile_info);
        $this->assertArrayHasKey('name', $profile_info);
        $this->assertEquals($profile_info['phone'], '3434');
        $this->assertEquals($profile_info['name'], 'Trunks Goten');

        $this->assertArrayHasKey('message', $messages);
        $this->assertEquals($messages['message'], 'PROFILE_UPDATED');
    }

    /**
	 * @covers Wiass_REST_Customer_API::update_customer_company_info
	 */
	function test_update_customer_company_info_as_guest() {
        wp_set_current_user(0);

        $request = new WP_REST_Request( 'PUT', '/wiaas/customer/1/company-info');
        $request->set_body_params(array(
            'company_name' => 'Saburly',
            'vat_code' => '12345'
        ));
		$response = $this->server->dispatch( $request );

		$this->assertNotNull($response);
		$this->assertInstanceOf('WP_REST_Response',$response);
		$this->assertTrue($response->is_error());
		$this->assertEquals($response->get_status(), 401);

		$error_data = $response->as_error();
		$this->assertEquals($error_data->get_error_message(), 'Sorry, you are not allowed to do that.');
    }

    /**
	 * @covers Wiass_REST_Customer_API::update_customer_company_info
	 */
	function test_update_customer_company_info_with_empty_company_name() {
        wp_set_current_user(1);

        $request = new WP_REST_Request( 'PUT', '/wiaas/customer/1/company-info');
        $request->set_body_params(array(
            'company_name' => '',
            'vat_code' => '12345'
        ));
		$response = $this->server->dispatch( $request );

		$this->assertNotNull($response);
		$this->assertInstanceOf('WP_REST_Response',$response);
		$this->assertFalse($response->is_error());
        $this->assertEquals($response->get_status(), 200);
        
        $data = $response->get_data();
        
        $this->assertArrayHasKey('data', $data);
        $this->assertArrayHasKey('messages', $data);

        $profile_info = $data['data'];
        $messages = $data['messages'][0];

        $this->assertArrayHasKey('company_name', $profile_info);
        $this->assertArrayHasKey('vat_code', $profile_info);
        $this->assertEquals($profile_info['company_name'], '');
        $this->assertEquals($profile_info['vat_code'], '');

        $this->assertArrayHasKey('message', $messages);
        $this->assertEquals($messages['message'], 'ADD_COMPANY_NAME');
    }

    /**
	 * @covers Wiass_REST_Customer_API::update_customer_company_info
	 */
	function test_update_customer_company_info_with_empty_vat() {
        wp_set_current_user(1);

        $request = new WP_REST_Request( 'PUT', '/wiaas/customer/1/company-info');
        $request->set_body_params(array(
            'company_name' => 'Saburly',
            'vat_code' => ''
        ));
		$response = $this->server->dispatch( $request );

		$this->assertNotNull($response);
		$this->assertInstanceOf('WP_REST_Response',$response);
		$this->assertFalse($response->is_error());
        $this->assertEquals($response->get_status(), 200);
        
        $data = $response->get_data();
        
        $this->assertArrayHasKey('data', $data);
        $this->assertArrayHasKey('messages', $data);

        $profile_info = $data['data'];
        $messages = $data['messages'][0];

        $this->assertArrayHasKey('company_name', $profile_info);
        $this->assertArrayHasKey('vat_code', $profile_info);
        $this->assertEquals($profile_info['company_name'], '');
        $this->assertEquals($profile_info['vat_code'], '');

        $this->assertArrayHasKey('message', $messages);
        $this->assertEquals($messages['message'], 'ADD_VAT');
    }

    /**
	 * @covers Wiass_REST_Customer_API::update_customer_company_info
     *
     * TODO: Fix this test to handle company info correctly
	 */
//	function test_update_customer_company_info() {
//        wp_set_current_user(1);
//
//        $request = new WP_REST_Request( 'PUT', '/wiaas/customer/1/company-info');
//        $request->set_body_params(array(
//            'company_name' => 'Saburly',
//            'vat_code' => '123'
//        ));
//        $response = $this->server->dispatch( $request );
//
//		$this->assertNotNull($response);
//		$this->assertInstanceOf('WP_REST_Response',$response);
//		$this->assertFalse($response->is_error());
//        $this->assertEquals($response->get_status(), 200);
//
//        $data = $response->get_data();
//
//        $this->assertArrayHasKey('data', $data);
//        $this->assertArrayHasKey('messages', $data);
//
//        $profile_info = $data['data'];
//        $messages = $data['messages'][0];
//
//        $this->assertArrayHasKey('company_name', $profile_info);
//        $this->assertArrayHasKey('vat_code', $profile_info);
//        $this->assertEquals($profile_info['company_name'], 'Saburly');
//        $this->assertEquals($profile_info['vat_code'], '123');
//
//        $this->assertArrayHasKey('message', $messages);
//        $this->assertEquals($messages['message'], 'COMPANY_UPDATED');
//    }

    

    //Helper functions
    private function create_dummy_address(){
        return array(
            'country_name' => 'Sweden',
            'delivery_mail' => 'delivery@email.com',
            'id_country_selected' => 1,
            'city' => 'Stockholm',
            'detailed_address' => 'Dummy Street 7',
            'zip_code' => 124443,
            'first_name' => 'Tester',
            'last_name' => 'Retset',
            'invoice_mail' => 'invoice@mail.com'
        );
    }

    private function insert_dummy_billing_address(){
        wp_set_current_user(1);
        
        $dummy_address = self::create_dummy_address();

        $request = new WP_REST_Request( 'PUT', '/wiaas/customer/1/billing-addresses');
        $request->set_body_params(array(
            'billing_address' => json_encode($dummy_address)
        ));
        $response = $this->server->dispatch( $request );
        
        return $response->get_data()['data']['billing_addresses'][0]['id'];
    }

    private function insert_dummy_profile_address(){
        wp_set_current_user(1);
        
        $dummy_address = self::create_dummy_address();

        $request = new WP_REST_Request( 'PUT', '/wiaas/customer/1/profile-addresses');
        $request->set_body_params(array(
            'profile_address' => json_encode($dummy_address)
        ));
        $response = $this->server->dispatch( $request );
        
        return $response->get_data()['data']['profile_addresses'][0]['id'];
    }
}
