<?php
/**
 * *****************************************************************************
 * Copyright (c) 2018 Eclipse Foundation and others.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * SPDX-License-Identifier: EPL-2.0
 ********************************************************************************/

/*
 * FIXME Experimental.
 */
require_once dirname ( __FILE__ ) . '/../classes/Project.class.php';
require_once dirname ( __FILE__ ) . '/../classes/BugzillaClient.class.inc';
require_once dirname ( __FILE__ ) . '/../classes/debug.php';
require_once dirname ( __FILE__ ) . '/../classes/database.inc';

class Release {
	var $project;
	var $name;
	var $date;

	/**
	 * This method answers an array containing all of releases that
	 * either have occurred or are planned to occur after a particular
	 * date. The method has two optional parameters. If specified, only
	 * those projects that descend from a particular root are included.
	 * If no date (UNIX time) is specified, then the current date is used.
	 *
	 * @param string $root the root project
	 * @param int $date the data in UNIX time
	 * @return Release[]
	 */
	public static function releasesAfter($root = null, $date = null) {
		$sql = "
			select
				project as id, name, date
			from ProjectReleases
			where project regexp ':pattern'
				and date > date(':date')
			order by date";
		$args = array(
			':pattern' => $root ? "^${root}(?:\..*)?$" : '',
			':date' => date('Y-m-d', $date ? $date : time())
		);

		return new DatabaseQuery('dashboard', $sql, $args, function ($row) use (&$releases) {
			$project = Project::getProject ( $row ['id'] );
			$name = $row ['name'];
			$date = strtotime ( $row ['date'] );

			return new Release ( $project, $name, $date );
		} );
	}

	private function __construct($project, $name, $date) {
		$this->project = $project;
		$this->name = $name;
		$this->date = $date;
	}

	public function getId() {
		return $this->project->getId ();
	}

	public function getUrl() {
		return $this->project->getUrl ();
	}

	public function getName() {
		return $this->project->getName () . ' ' . $this->name;
	}

	public function getDate() {
		return $this->date;
	}

	public function getVersion() {
		return $this->makeThreePartVersionNumber($this->name);
	}

	public function getTrackingBugUrl() {
		$bugzilla = new BugzillaClient('https://bugs.eclipse.org/bugs');
		$bugs = $bugzilla->findBugs()
			->setProduct('Community')
			->setComponent('Proposals and Reviews')
			->setSummary($this->getTrackingBugSummary())
			->searchBugs();

		foreach ($bugs as $bug) {
			return $bug->getUrl();
		}

		return null;
	}

	private function getTrackingBugSummary() {
		return "[release] {$this->project->getId()} {$this->getVersion()}";
	}

	public static function makeThreePartVersionNumber($value) {
		if (preg_match('/(\d+)(\.\d+)?(\.\d+)?/', $value, $matches)) {
			$name = $matches[1];
			$name .= isset($matches[2]) && $matches[2] ? $matches[2] : '.0';
			$name .= isset($matches[3]) && $matches[3] ? $matches[3] : '.0';
			return $name;
		}
		else
			if (preg_match('/(\d+(\.\d+){1,2})/', $value)) {
				return $match[1];
			}
		else {
			return null;
		}
	}

	private static function getProbableReviewDate($date) {
		$diff = date ( 'w', $date ) - 3; // '3' means Wednesday
		if ($diff < 0)
			$diff += 7;

		$date = strtotime ( "-$diff days", $date );
		$now = strtotime ( 'now' );
		$dates = array ();
		while ( $date > $now ) {
			// There's probably a better way to do this, but
			// the month boundaries are icky, this works, and is simple.
			if (self::isFirstOrThirdWeek ( $date )) {
				return $date;
			}
			$date = strtotime ( "-1 week", $date );
		}
		return 0;
	}

	/**
	 * Answers whether the provided date represents either the
	 * first or the third week of the month.
	 *
	 * @see Release::getProbableReviewDate()
	 * @param int $date
	 */
	private static function isFirstOrThirdWeek($date) {
		$day = date ( 'j', $date ) - 1; // 0-based day of the month
		if (floor ( $day / 7 ) == 0)
			return true; // first week
		if (floor ( $day / 7 ) == 2)
			return true; // third week
		return false;
	}
}