<?php

class OsCustomerHelper {


	public static function quick_customer_btn_html( $customer_id = false, $params = array() ) {
		$html = '';
		if ( $customer_id ) {
			$params['customer_id'] = $customer_id;
		}
		$route = OsRouterHelper::build_route_name( 'customers', !empty($customer_id) ? 'quick_edit' : 'quick_new' );

		$params_str = http_build_query( $params );
		$html       = 'data-os-params="' . esc_attr($params_str) . '" 
    data-os-action="' . esc_attr($route) . '" 
    data-os-output-target="side-panel"
    data-os-after-call="latepoint_init_quick_customer_form"';

		return $html;
	}

	public static function generate_summary_for_customer( OsCustomerModel $customer, bool $editable = false ): void {
		?>
        <div class="summary-box summary-box-customer-info">
            <div class="summary-box-heading">
                <div class="sbh-item"><?php esc_html_e( 'Customer', 'latepoint' ) ?></div>
                <div class="sbh-line"></div>
            </div>
            <div class="summary-box-content with-media">
                <div class="os-avatar-w">
                    <div class="os-avatar"><span><?php echo esc_html( $customer->get_initials() ); ?></span></div>
                </div>
                <div class="sbc-content-i">
                    <?php if($editable){ ?>
                    <div class="sbc-main-item sbc-with-action"><div class="sbc-label"><?php echo esc_html( $customer->full_name ); ?></div><div class="sbc-action load-customer-step-trigger"><i class="latepoint-icon latepoint-icon-edit-3"></i></div></div>
                    <?php }else{ ?>
                    <div class="sbc-main-item"><?php echo esc_html( $customer->full_name ); ?></div>
                    <?php } ?>
                    <div class="sbc-sub-item"><?php echo esc_html( $customer->primary_contact_type() ); ?></div>
                </div>
            </div>
			<?php
			$customer_attributes = [];
			$customer_attributes = apply_filters( 'latepoint_booking_summary_customer_attributes', $customer_attributes, $customer );
			if ( $customer_attributes ) {
				echo '<div class="summary-attributes sa-clean sa-hidden">';
				foreach ( $customer_attributes as $attribute ) {
					echo '<span>' . esc_html( $attribute['label'] ) . ': <strong>' . esc_html( $attribute['value'] ) . '</strong></span>';
				}
				echo '</div>';
			}
			?>
        </div>
		<?php
	}

	public static function get_customers_for_select() {
		$customers         = new OsCustomerModel();
		$customers         = $customers->set_limit( 100 )->get_results_as_models();
		$customers_options = [];
		foreach ( $customers as $customer ) {
			$customers_options[] = [ 'value' => $customer->id, 'label' => esc_html( $customer->full_name ) ];
		}

		return $customers_options;
	}

	public static function get_full_name( $customer ) {
		return join( ' ', array( $customer->first_name, $customer->last_name ) );
	}

	public static function get_avatar_url( $customer ) {
		$default_avatar = LATEPOINT_IMAGES_URL . 'default-avatar.jpg';
		if ( OsAuthHelper::can_wp_users_login_as_customers() && $customer->wordpress_user_id && empty( $customer->avatar_image_id ) ) {
			// try to get gravatar with WP function
			$avatar_url = get_avatar_url( $customer->wordpress_user_id );
		} else {
			$avatar_url = false;
		}
		if ( ! $avatar_url ) {
			$avatar_url = OsImageHelper::get_image_url_by_id( $customer->avatar_image_id, 'thumbnail', $default_avatar );
		}

		return $avatar_url;
	}


	public static function get_avatar_image( $customer ) {
		return '<img src="' . self::get_avatar_url( $customer ) . '"/>';
	}


	public static function total_new_customers_for_date( $date ) {
		$customers = new OsCustomerModel();
		$customers = $customers->where( array( 'DATE(created_at)' => $date ) );

		return $customers->count();
	}

    public static function can_cancel_booking( OsBookingModel $booking ): bool {
        $can_cancel = false;

        if ( OsSettingsHelper::is_on( 'allow_customer_booking_cancellation' ) && ( $booking->status != LATEPOINT_BOOKING_STATUS_CANCELLED ) ) {
            if ( OsSettingsHelper::is_on( 'limit_when_customer_can_cancel' ) ) {
                // check if there is a limit on when they can cancel
                $limit_value = OsSettingsHelper::get_settings_value( 'cancellation_limit_value' );
                $limit_unit  = OsSettingsHelper::get_settings_value( 'cancellation_limit_unit' );
                if ( $limit_value && $limit_unit ) {
                    $now = new OsWpDateTime( 'now' );
                    if ( $now <= $booking->get_start_datetime_object()->modify( '-' . $limit_value . ' ' . $limit_unit ) ) {
                        $can_cancel = true;
                    }
                }
            } else {
                $can_cancel = true;
            }
        }

        /**
         * Filter to allow to modify the can_cancel booking status
         *
         * @param bool $can_cancel
         * @param OsBookingModel $booking
         * @returns bool
         *
         * @since 5.2.0
         * @hook latepoint_can_cancel_booking
         *
         */
        $can_cancel = apply_filters('latepoint_can_cancel_booking', $can_cancel, $booking);

        return $can_cancel;
    }

	public static function can_reschedule_booking( OsBookingModel $booking ): bool {
        if(!apply_filters('latepoint_is_feature_reschedule_available', false)) return false;
		if ( OsSettingsHelper::is_on( 'allow_customer_booking_reschedule' ) && ( $booking->status != LATEPOINT_BOOKING_STATUS_CANCELLED ) ) {
			if ( OsSettingsHelper::is_on( 'limit_when_customer_can_reschedule' ) ) {
				// check if there is a limit on when they can reschedule
				$limit_value = OsSettingsHelper::get_settings_value( 'reschedule_limit_value' );
				$limit_unit  = OsSettingsHelper::get_settings_value( 'reschedule_limit_unit' );
				if ( $limit_value && $limit_unit ) {
					$now = new OsWpDateTime( 'now' );
					if ( $now <= $booking->get_start_datetime_object()->modify( '-' . $limit_value . ' ' . $limit_unit ) ) {
						return true;
					}
				}
			} else {
				return true;
			}
		}

		return false;
	}


	public static function get_customer_for_wp_user( $wp_user ) {
		$customer = new OsCustomerModel();
		$customer = $customer->where( [ 'wordpress_user_id' => $wp_user->ID ] )->set_limit( 1 )->get_results_as_models();
		if ( $customer ) {
			if ( $customer->email != $wp_user->user_email ) {

				$email_already_assigned = new OsCustomerModel();
                $email_already_assigned = $email_already_assigned->where([ 'email' => $wp_user->user_email, 'id !=' => $customer->id ])->set_limit( 1 )->get_results_as_models();

                if (!$email_already_assigned) {
				    $customer->update_attributes( [ 'email' => $wp_user->user_email ] );
                }
			}

			return $customer;
		} else {
			// check if customer with this email exists
			$customer = new OsCustomerModel();
			$customer = $customer->where( [ 'email' => $wp_user->user_email ] )->set_limit( 1 )->get_results_as_models();
			if ( $customer ) {
				$old_customer_data = $customer->get_data_vars();
				$customer->update_attributes( [ 'wordpress_user_id' => $wp_user->ID ] );
				do_action( 'latepoint_customer_updated', $customer, $old_customer_data );
			} else {
				// create new customer
				$customer             = new OsCustomerModel();
				$customer->first_name = $wp_user->first_name;
				$customer->last_name  = $wp_user->last_name;
				$customer->email      = $wp_user->user_email;
				$customer->password   = $wp_user->user_pass;
				$customer->is_guest   = false;
				$customer->save( true );
				do_action( 'latepoint_customer_created', $customer );
			}
		}

		return $customer;
	}

	public static function count_customers_not_connected_to_wp_users() {
		$customers = new OsCustomerModel();

		return $customers->where( [ 'wordpress_user_id' => [ 'OR' => [ 0, 'IS NULL' ] ] ] )->count();
	}

    public static function get_by_contact($contact_value, $contact_type){
        if(empty($contact_value) || empty($contact_type)) return false;
        $customer = new OsCustomerModel();
        switch($contact_type){
            case 'email':
                $customer = $customer->where(['email' => $contact_value])->set_limit(1)->get_results_as_models();
                break;
            case 'phone':
                $customer = $customer->where(['phone' => $contact_value])->set_limit(1)->get_results_as_models();
                break;
        }
        return $customer;
    }

	public static function get_by_account_nonse( $account_nonse ) {
		if ( empty( $account_nonse ) ) {
			return false;
		}
        $account_nonse = sanitize_text_field( $account_nonse );
		$customer = new OsCustomerModel();

		return $customer->where( [ 'account_nonse' => $account_nonse ] )->set_limit( 1 )->get_results_as_models();
	}

	public static function create_wp_user_for_customer( $customer ) {
		// NO connected wp user, create one
		// check if wp user with this customer email already exists
		$wp_user_id = email_exists( $customer->email );
		if ( ! $wp_user_id ) {
			$wp_user_id = username_exists( $customer->email );
		}
		if ( $wp_user_id ) {
			// wp user with this email or username exists - check if its linked to another customer already - if not link it to current customer
			$linked_customer = new OsCustomerModel();
			$linked_customer = $linked_customer->where( [ 'wordpress_user_id' => $wp_user_id ] )->set_limit( 1 )->get_results_as_models();
			if ( $linked_customer ) {
				// wp user with this email exists and is linked already to a different latepoint customer
				$customer->add_error( 'customer_exists', __( 'Customer with this email already exists', 'latepoint' ) );
			} else {
				$customer->update_attributes( [ 'wordpress_user_id' => $wp_user_id, 'is_guest' => false ] );
			}
		} else {

			$userdata   = [
				'user_email' => $customer->email,
				'first_name' => $customer->first_name,
				'last_name'  => $customer->last_name,
				'user_login' => $customer->email,
				'user_pass'  => $customer->password,
			];

            $default_role = OsSettingsHelper::get_default_wp_role_for_new_customers();
            if(wp_roles()->is_role( $default_role )){
                $userdata['role'] = $default_role;
            }

			$wp_user_id = wp_insert_user( $userdata );
			if ( ! is_wp_error( $wp_user_id ) ) {
				$customer->update_attributes( [ 'wordpress_user_id' => $wp_user_id ] );
				// update password directly in database because we already hashed it in latepoint customer
				global $wpdb;
				$wpdb->update(
					$wpdb->users,
					array(
						'user_pass'           => $customer->password,
						'user_activation_key' => '',
					),
					array( 'ID' => $wp_user_id )
				);
			} else {
				OsDebugHelper::log( 'Error creating WP User for customer', 'registration_error', [ 'errors' => $wp_user_id->get_error_messages() ] );
			}
		}

		return ( ! is_wp_error( $wp_user_id ) ) ? $wp_user_id : false;
	}

	public static function generate_booking_summary_preview_btn( int $booking_id ): string {
		$html = 'data-os-after-call="latepoint_init_booking_summary_lightbox"
			   data-os-params="' . esc_attr(OsUtilHelper::build_os_params( [ 'booking_id' => $booking_id ] )) . '"
			   data-os-action="' . esc_attr(OsRouterHelper::build_route_name( 'customer_cabinet', 'view_booking_summary_in_lightbox' )) . '"
			   data-os-output-target="lightbox"
				data-os-lightbox-classes="width-500 customer-dashboard-booking-summary-lightbox"';

		return $html;
	}


	public static function generate_bundle_scheduling_btn( int $order_item_id ): string {
		$html = 'data-os-after-call="latepoint_init_bundle_scheduling_summary"
			   data-os-params="' . esc_attr(OsUtilHelper::build_os_params( [ 'order_item_id' => $order_item_id ] )) . '"
			   data-os-action="' . esc_attr(OsRouterHelper::build_route_name( 'customer_cabinet', 'scheduling_summary_for_bundle' )) . '"
			   data-os-output-target="lightbox"
				data-os-lightbox-classes="width-500 customer-dashboard-bundle-scheduling-summary"';

		return $html;
	}

	public static function generate_order_summary_btn( int $order_id ): string {
		$html = 'data-os-after-call="latepoint_init_order_summary_lightbox"
			   data-os-params="' . esc_attr(OsUtilHelper::build_os_params( [ 'order_id' => $order_id ] )) . '"
			   data-os-action="' . esc_attr(OsRouterHelper::build_route_name( 'customer_cabinet', 'view_order_summary_in_lightbox' )) . '"
			   data-os-output-target="lightbox"
				data-os-lightbox-classes="width-500 customer-dashboard-order-summary-lightbox"';

		return $html;
	}

	public static function get_by_uuid( string $uuid ) {
        if(empty($uuid)) return false;
        $customer = new OsCustomerModel();
        return $customer->where(['uuid' => $uuid])->set_limit(1)->get_results_as_models();
	}

}