/**
 * Get an activation record by its location.
 *
 * @api
 *
 * @since 1.0
 *
 * @param string      $location
 * @param \ITELIC\Key $key
 *
 * @return \ITELIC\Activation|null
 */
function itelic_get_activation_by_location($location, \ITELIC\Key $key)
{
    $activations = itelic_get_activations(array('location' => $key->is_online_product() ? itelic_normalize_url($location) : $location, 'key' => $key->get_key(), 'items_per_page' => 1));
    if (empty($activations)) {
        return null;
    }
    return reset($activations);
}
 /**
  * Create an activation.
  *
  * @param Key       $key
  * @param string    $location
  * @param \DateTime $activation
  * @param Release   $release
  * @param string    $status
  *
  * @return Activation
  *
  * @throws \LogicException|DB_Exception
  */
 public static function create(Key $key, $location, \DateTime $activation = null, Release $release = null, $status = '')
 {
     if (empty($key) || empty($location)) {
         throw new \InvalidArgumentException(__("The license key and install location are required.", Plugin::SLUG));
     }
     if (strlen($location) > 191) {
         throw new \LengthException("The location field has a max length of 191 characters.");
     }
     if ($key->get_max() && $key->get_active_count() >= $key->get_max()) {
         throw new \OverflowException(__("This license key has reached it's maximum number of activations.", Plugin::SLUG));
     }
     if ($activation === null) {
         $activation = make_date_time()->format('Y-m-d H:i:s');
     } else {
         $activation = $activation->format('Y-m-d H:i:s');
     }
     if (empty($status)) {
         $status = self::ACTIVE;
     }
     if ($key->is_online_product()) {
         $location = itelic_normalize_url($location);
     }
     $data = array('lkey' => $key->get_key(), 'location' => $location, 'activation' => $activation, 'deactivation' => null, 'status' => $status);
     if ($release) {
         $data['release_id'] = $release->get_pk();
     }
     $db = Manager::make_simple_query_object('itelic-activations');
     $existing_activation = itelic_get_activation_by_location($location, $key);
     if ($existing_activation) {
         throw new \InvalidArgumentException(__("An activation with this same location already exists.", Plugin::SLUG));
     }
     $id = $db->insert($data);
     if (!$id) {
         return null;
     }
     $activation = self::get($id);
     Cache::add($activation);
     if (!$release) {
         $latest = $key->get_product()->get_latest_release_for_activation($activation);
         if ($latest) {
             $activation->set_release($latest);
         }
     }
     /**
      * Fires when an activation record is created.
      *
      * @since 1.0
      *
      * @param Activation $activation
      */
     do_action('itelic_create_activation', $activation);
     return $activation;
 }
    /**
     * Render the view.
     */
    public function render()
    {
        if (!$this->key) {
            return;
        }
        wp_enqueue_style('itelic-admin-license-detail');
        wp_enqueue_script('itelic-admin-license-detail');
        wp_localize_script('itelic-admin-license-detail', 'ITELIC', array('ajax' => admin_url('admin-ajax.php'), 'key' => $this->key->get_key(), 'disabling' => __("Deactivating", Plugin::SLUG), 'df' => it_exchange_php_date_format_to_jquery_datepicker_format($this->get_short_df()), 'update_nonce' => wp_create_nonce('itelic-update-key-' . $this->key->get_key()), 'statuses' => json_encode(Key::get_statuses())));
        $jdf = it_exchange_php_date_format_to_jquery_datepicker_format($this->get_short_df());
        $online = $this->key->is_online_product();
        $disable_activate = $this->key->get_status() != Key::ACTIVE;
        $disable_tip = __("Disabled or expired licenses cannot be activated.", Plugin::SLUG);
        $disable_title = $disable_activate ? "title=\"{$disable_tip}\"" : '';
        $disable_class = $disable_activate ? 'button-disabled' : '';
        $disabled_input = $disable_activate ? ' disabled' : '';
        ?>

		<div id="it-exchange-license-details">
			<div class="spacing-wrapper bottom-border header-block">

				<div class="status status-<?php 
        echo esc_attr($this->key->get_status());
        ?>
">
					<span data-value="<?php 
        echo esc_attr($this->key->get_status());
        ?>
" title="<?php 
        esc_attr_e("Click to edit", Plugin::SLUG);
        ?>
">
						<?php 
        echo $this->key->get_status(true);
        ?>
					</span>
				</div>

				<div class="name-block">
					<h2 class="customer-name"><?php 
        echo $this->key->get_customer()->wp_user->display_name;
        ?>
</h2>

					<h2 class="product-name"><?php 
        echo $this->key->get_product()->post_title;
        ?>
</h2>
				</div>
				<div class="key-block">
					<p>
						<label for="license-key" class="screen-reader-text"><?php 
        _e("License Key", Plugin::SLUG);
        ?>
</label>
						<input type="text" id="license-key" size="<?php 
        echo strlen($this->key->get_key());
        ?>
"
						       readonly value="<?php 
        echo esc_attr($this->key->get_key());
        ?>
">
					</p>
				</div>
			</div>

			<div class="spacing-wrapper bottom-border third-row misc-block">
				<div class="third expires">
					<h4><?php 
        _e("Expires", Plugin::SLUG);
        ?>
</h4>

					<h3 title="<?php 
        esc_attr_e("Click to edit", Plugin::SLUG);
        ?>
" data-df="<?php 
        echo $jdf;
        ?>
">
						<?php 
        if (null === ($d = $this->key->get_expires())) {
            ?>
							<?php 
            _e("Never", Plugin::SLUG);
            ?>
						<?php 
        } else {
            ?>
							<?php 
            echo \ITELIC\convert_gmt_to_local($d)->format($this->get_short_df());
            ?>
						<?php 
        }
        ?>
					</h3>
				</div>
				<div class="third transaction">
					<h4><?php 
        _e("Transaction", Plugin::SLUG);
        ?>
</h4>

					<h3>
						<a href="<?php 
        echo esc_url(get_edit_post_link($this->key->get_transaction()->ID));
        ?>
">
							<?php 
        echo it_exchange_get_transaction_order_number($this->key->get_transaction());
        ?>
						</a>
					</h3>
				</div>
				<div class="third max-activations">
					<h4><?php 
        _e("Max Activations", Plugin::SLUG);
        ?>
</h4>

					<h3 title="<?php 
        esc_attr_e("Click to edit", Plugin::SLUG);
        ?>
">
						<?php 
        echo $this->key->get_max() ? $this->key->get_max() : __('Unlimited', Plugin::SLUG);
        ?>
					</h3>
				</div>
			</div>

			<div class="spacing-wrapper activations<?php 
        echo count($this->renewals) ? ' bottom-border' : '';
        ?>
">
				<h3><?php 
        _e("Activations", Plugin::SLUG);
        ?>
</h3>

				<table id="activations-table" class="widefat">
					<thead>
					<tr>
						<th class="location-col"><?php 
        _e("Location", Plugin::SLUG);
        ?>
</th>
						<th class="status-col"><?php 
        _e("Status", Plugin::SLUG);
        ?>
</th>
						<th class="activation-col"><?php 
        _e("Activation", Plugin::SLUG);
        ?>
</th>
						<th class="deactivation-col"><?php 
        _e("Deactivation", Plugin::SLUG);
        ?>
</th>
						<th class="version-col"><?php 
        _e("Version", Plugin::SLUG);
        ?>
</th>
						<th class="delete-col">
							<span class="screen-reader-text"><?php 
        _e("Delete", Plugin::SLUG);
        ?>
</span></th>
					</tr>
					</thead>

					<tbody>
					<?php 
        foreach ($this->key->get_activations() as $activation) {
            ?>

						<?php 
            echo $this->get_activation_row_html($activation);
            ?>

					<?php 
        }
        ?>
					</tbody>
				</table>

				<h4><?php 
        _e("Remote Activate", Plugin::SLUG);
        ?>
</h4>

				<label for="remote-activate-location" class="screen-reader-text"><?php 
        _e("Install Location", Plugin::SLUG);
        ?>
</label>
				<input type="<?php 
        echo $online ? 'url' : 'text';
        ?>
" id="remote-activate-location"
				       placeholder="<?php 
        _e("Install Location", Plugin::SLUG);
        ?>
"<?php 
        echo $disabled_input;
        ?>
>
				<input type="submit" id="remote-activate-submit" class="it-exchange-button <?php 
        echo $disable_class;
        ?>
"
				       value="<?php 
        esc_attr_e("Activate", Plugin::SLUG);
        ?>
" data-tip="<?php 
        echo $disable_tip;
        ?>
"<?php 
        echo $disable_title;
        ?>
>
				<input type="hidden" id="remote-activate-key" value="<?php 
        echo esc_attr($this->key->get_key());
        ?>
">
				<?php 
        wp_nonce_field('itelic-remote-activate-key-' . $this->key->get_key());
        ?>
			</div>

			<?php 
        if (count($this->renewals)) {
            ?>

				<div class="spacing-wrapper renewals">

					<h3><?php 
            _e("Renewal History", Plugin::SLUG);
            ?>
</h3>

					<ul>
						<?php 
            foreach ($this->renewals as $renewal) {
                ?>

							<li>
								<?php 
                echo $renewal->get_renewal_date()->format(get_option('date_format'));
                ?>
								&nbsp;&mdash;&nbsp;

								<?php 
                if ($renewal->get_transaction()) {
                    ?>
									<a href="<?php 
                    echo get_edit_post_link($renewal->get_transaction()->ID);
                    ?>
">
										<?php 
                    echo it_exchange_get_transaction_order_number($renewal->get_transaction());
                    ?>
									</a>
								<?php 
                } else {
                    ?>
									<?php 
                    _e("Manual Renewal", Plugin::SLUG);
                    ?>
								<?php 
                }
                ?>
							</li>

						<?php 
            }
            ?>
					</ul>

				</div>

			<?php 
        }
        ?>

			<?php 
        /**
         * Fires at the end of the single license screen.
         *
         * @since 1.0
         *
         * @param Key $key
         */
        do_action('itelic_single_license_screen_end', $this->key);
        ?>

		</div>

		<?php 
        /**
         * Fires after the main single license screen.
         *
         * @since 1.0
         *
         * @param Key $key
         */
        do_action('itelic_single_license_screen_after', $this->key);
    }