if ( !window.isekai ) {
  window.isekai = {
    ui: {}
  };
}
if ( !window.isekai.ui ) {
  window.isekai.ui = {};
}

/**
 * Input for create page and auto complete parent page
 * @class
 * @extends OO.ui.TextInputWidget
 * @mixins OO.ui.mixin.LookupElement
 *
 * @constructor
 * @param {Object} config Configuration options
 */
isekai.ui.CreatePageInputWidget = function IsekaiUiCreatePageInputWidget( config ) {
	// Parent constructor
	OO.ui.TextInputWidget.call( this, config );
	// Mixin constructors
	OO.ui.mixin.LookupElement.call( this, config );

  this.api = new mw.Api();

  this.pagePrefix = config.pagePrefix || "";

  this.loadedPageList = [];
};
OO.inheritClass( isekai.ui.CreatePageInputWidget, OO.ui.TextInputWidget );
OO.mixinClass( isekai.ui.CreatePageInputWidget, OO.ui.mixin.LookupElement );

isekai.ui.CreatePageInputWidget.prototype.setPagePrefix = function ( pagePrefix ) {
  this.pagePrefix = pagePrefix;
  this.requestCache = {}; // Clear cache
}
/**
 * @inheritdoc
 */
isekai.ui.CreatePageInputWidget.prototype.getLookupRequest = function () {
	var
		value = this.getValue(),
		deferred = $.Deferred();
  var api = this.api;
  var _this = this;
  var pageName = this.pagePrefix + value;
	this.getValidity().then( function () {
    api.get( {
      action: "opensearch",
      search: pageName,
    } ).done( function (data) {
      if ( Array.isArray(data) && data.length > 0 ) {
        var pageList = data[1];

        pageList = pageList.map( function (pageTitle) {
          return pageTitle.substring( _this.pagePrefix.length );
        } );

        deferred.resolve( pageList );

        // Set cache
        pageList.forEach( function (pageTitle) {
          if ( !_this.loadedPageList.includes( pageTitle ) ) {
            _this.loadedPageList.push( pageTitle );
          }
        } );
      } else {
        deferred.resolve( [] );
      }
    } );
	}, function () {
		// No results when the input contains invalid content
		deferred.resolve( [] );
	} );
	return deferred.promise( { abort: function () {} } );
};
/**
 * @inheritdoc
 */
isekai.ui.CreatePageInputWidget.prototype.getLookupCacheDataFromResponse = function ( response ) {
	return response || [];
};
/**
 * @inheritdoc
 */
isekai.ui.CreatePageInputWidget.prototype.getLookupMenuOptionsFromData = function ( data ) {
	return ( data || [] ).map( function (one) {
    return new OO.ui.MenuOptionWidget( {
      data: one + "/",
      label: one
    } )
  } );
};