/*:
 * @plugindesc v.1.1.0 [MV|MZ] [Add-on] Adds a “Favorite” command for items with skills in the inventory. Allows you to add items to your favorites for quick access.
 * @author DKPlugins
 * @url https://dk-plugins.ru
 * @target MZ
 * @base DK_Item_Actions
 * @orderAfter DK_Item_Actions
 * @help

 ### Info about plugin ###
 Title: DK_Item_Equip_Action
 Author: DKPlugins
 Site: https://dk-plugins.ru
 Version: 1.1.0
 Release: 05.10.2024
 First release: 05.10.2024

 ###===========================================================================
 ## Requirements and dependencies
 ###===========================================================================
 Availability of working plugin DK_Item_Actions
 Download page: https://dk-plugins.ru/item-actions

 The plugin does not work with other plugins that hide the category window!

 ###=========================================================================
 ## Compatibility
 ###=========================================================================
 RPG Maker MV: 1.5+
 RPG Maker MZ: 1.0+

 ###=========================================================================
 ## See also
 ###=========================================================================
 1. Mouse System (https://dk-plugins.ru/mouse-system/)
 Allows you to change the mouse cursor, activate events by clicking, hovering, etc.

 2. Picture Choices (https://dk-plugins.ru/picture-choices/)
 Allows to use a graphic buttons instead of the choice window.

 3. Pictures Glow (https://dk-plugins.ru/pictures-glow/)
 Allows highlighting pictures on mouse hover.

 4. Video Player (https://dk-plugins.ru/video-player/)
 Adds video to the title screen, credits, the layers on the map and other.

 5. Events Glow (https://dk-plugins.ru/events-glow/)
 Allows highlighting events on mouse hover.

 ###=========================================================================
 ## License and terms of use
 ###=========================================================================
 You can:
 -To use the plugin for your non-commercial projects
 -Change code of the plugin

 You cannot:
 -Delete or change any information about the plugin
 -Distribute the plugin and its modifications

 ## Commercial license ##
 Visit the page: https://dk-plugins.ru/commercial-license/

 ###===========================================================================
 ## Support
 ###===========================================================================
 Become a subscriber on boosty: https://boosty.to/dkplugins
 Become a subscriber on patreon: https://patreon.com/dkplugins
 Donate: https://dk-plugins.ru/donate



 * @param favoritesCommandName
 * @text Category name
 * @desc Category name
 * @default Favorites

 * @param favoritesCommandPosition
 * @text Category position
 * @desc Category position
 * @type select
 * @option First
 * @value first
 * @option Last
 * @value last
 * @default last

 * @param addFavoriteCommandName
 * @text Add favorite command name
 * @desc Add favorite command name
 * @default Add Favorites

 * @param removeFavoriteCommandName
 * @text Remove favorite command name
 * @desc Remove favorite command name
 * @default Remove Favorites

 * @param showFavoritesCount
 * @text Show favorites count
 * @desc Show count of favorite items in the category name
 * @type boolean
 * @default false

 * @param selectFavoriteCategory
 * @text Select favorite category
 * @desc Select favorite category at the opening of the inventory if there are favorite items
 * @type boolean
 * @default true

*/

/*:ru
 * @plugindesc v.1.1.0 [MV|MZ] [Дополнение] Добавляет команду "Избранное" для предметов в инвентаре. Позволяет добавлять предметы в избранное для быстрого доступа.
 * @author DKPlugins
 * @url https://dk-plugins.ru
 * @target MZ
 * @base DK_Item_Actions
 * @orderAfter DK_Item_Actions
 * @help

 ### Информация о плагине ###
 Название: DK_Item_Equip_Action
 Автор: DKPlugins
 Сайт: https://dk-plugins.ru
 Контакты: https://dk-plugins.ru/contacts
 Версия: 1.1.0
 Релиз: 05.10.2024
 Первый релиз: 05.10.2024

 ###===========================================================================
 ## Требования и зависимости
 ###===========================================================================
 Наличие включенного плагина DK_Item_Actions
 Страница загрузки: https://dk-plugins.ru/item-actions

 Плагин не работает с другими плагинами, которые скрывают окно категорий!

 ###=========================================================================
 ## Совместимость
 ###=========================================================================
 RPG Maker MV: 1.5+
 RPG Maker MZ: 1.0+

 ###=========================================================================
 ## Смотрите также
 ###=========================================================================
 1. Система Мыши (https://dk-plugins.ru/mouse-system/)
 Позволяет изменять курсор мыши, активировать события нажатием, наведением и др.

 2. Выбор С Изображениями (https://dk-plugins.ru/picture-choices/)
 Позволяет использовать графические кнопки вместо окна выбора.

 3. Свечение Изображений (https://dk-plugins.ru/pictures-glow/)
 Позволяет подсвечивать изображения при наведении мыши.

 4. Видео плеер (https://dk-plugins.ru/video-player/)
 Добавляет видео перед титульным экраном, титры, слои на карте и другое.

 5. Свечение Событий (https://dk-plugins.ru/events-glow/)
 Позволяет подсвечивать события при наведении мыши.

 ###=========================================================================
 ## Лицензия и правила использования плагина
 ###=========================================================================
 Вы можете:
 -Использовать плагин в некоммерческих проектах
 -Изменять код плагина

 Вы не можете:
 -Удалять или изменять любую информацию о плагине
 -Распространять плагин и его модификации

 ## Коммерческая лицензия ##
 Посетите страницу: https://dk-plugins.ru/commercial-license/

 ###=========================================================================
 ## Поддержка
 ###=========================================================================
 Стать подписчиком на boosty: https://boosty.to/dkplugins
 Стать подписчиком на patreon: https://patreon.com/dkplugins
 Поддержать: https://dk-plugins.ru/donate



 * @param favoritesCommandName
 * @text Название категории
 * @desc Название категории
 * @default Избранное

 * @param favoritesCommandPosition
 * @text Позиция категории
 * @desc Позиция категории
 * @type select
 * @option Первый
 * @value first
 * @option Последний
 * @value last
 * @default last

 * @param addFavoriteCommandName
 * @text Команда Добавить Избранное
 * @desc Команда Добавить Избранное
 * @default Добавить Избранное

 * @param removeFavoriteCommandName
 * @text Команда Убрать Избранное
 * @desc Команда Убрать Избранное
 * @default Убрать Избранное

 * @param showFavoritesCount
 * @text Показывать количество избранных
 * @desc Показывать количество избранных предметов в названии категории
 * @type boolean
 * @default false

 * @param selectFavoriteCategory
 * @text Выбрать категорию избранного
 * @desc Выбрать категорию избранного при открытии инвентаря, если есть любимые предметы
 * @type boolean
 * @default true

*/

'use strict';

var Imported = Imported || {};
Imported['DK_Item_Favorite_Action'] = '1.1.0';

if (!Imported['DK_Item_Actions']) {
    throw new Error('"DK_Item_Favorite_Action" require "DK_Item_Actions" plugin!');
}

//===========================================================================
// initialize parameters
//===========================================================================

const ItemFavoriteActionParams = (function() {

    function parse(string) {
        try {
            return JSON.parse(string, function(key, value) {
                if (typeof string === 'number' || typeof string === 'boolean') {
                    return string;
                }

                try {
                    if (Array.isArray(value)) {
                        return value.map(val => parse(val));
                    }

                    return parse(value);
                } catch (e) {
                    return value;
                }
            });
        } catch(e) {
            return string;
        }
    }

    const parameters = PluginManager.parameters('DK_Item_Favorite_Action');

    return Object.entries(parameters).reduce((acc, [key, value]) => {
        acc[key] = parse(value);

        return acc;
    }, {});

})();

//===========================================================================
// Game_Player
//===========================================================================

const ItemFavoriteAction_Game_Party_initialize =
    Game_Party.prototype.initialize;
Game_Party.prototype.initialize = function() {
    ItemFavoriteAction_Game_Party_initialize.apply(this, arguments);
    this._favoriteItems = { items: [], weapons: [], armors: [] };
};

Game_Party.prototype.favoriteItems = function() {
    return this._favoriteItems.items.map(id => $dataItems[id])
        .concat(this._favoriteItems.weapons.map(id => $dataWeapons[id]),
            this._favoriteItems.armors.map(id => $dataArmors[id]))
        .filter(item => this.hasItem(item));
};

Game_Party.prototype.isFavoriteItem = function(item) {
    if (DataManager.isItem(item)) {
        return this._favoriteItems.items.includes(item.id);
    } else if (DataManager.isWeapon(item)) {
        return this._favoriteItems.weapons.includes(item.id);
    } else if (DataManager.isArmor(item)) {
        return this._favoriteItems.armors.includes(item.id);
    }

    return false;
};

Game_Party.prototype.addFavoriteItem = function(item) {
    if (this.isFavoriteItem(item)) {
        return;
    }

    if (DataManager.isItem(item)) {
        this._favoriteItems.items.push(item.id);
    } else if (DataManager.isWeapon(item)) {
        this._favoriteItems.weapons.push(item.id);
    } else if (DataManager.isArmor(item)) {
        this._favoriteItems.armors.push(item.id);
    }
};

Game_Party.prototype.removeFavoriteItem = function(item) {
    let container;

    if (DataManager.isItem(item)) {
        container = this._favoriteItems.items;
    } else if (DataManager.isWeapon(item)) {
        container = this._favoriteItems.weapons;
    } else if (DataManager.isArmor(item)) {
        container = this._favoriteItems.armors;
    }

    if (container) {
        container.splice(container.indexOf(item.id), 1);
    }
};

//===========================================================================
// Scene_Item
//===========================================================================

const ItemFavoriteAction_Scene_Item_evalAction =
    Scene_Item.prototype.evalAction;
Scene_Item.prototype.evalAction = function(action) {
    if (action.symbol === 'favorite') {
        const item = this.item();

        if ($gameParty.isFavoriteItem(item)) {
            $gameParty.removeFavoriteItem(item);
        } else {
            $gameParty.addFavoriteItem(item);
        }
    }

    ItemFavoriteAction_Scene_Item_evalAction.apply(this, arguments);
};

const ItemFavoriteAction_Scene_Item_start =
    Scene_Item.prototype.start;
Scene_Item.prototype.start = function() {
    ItemFavoriteAction_Scene_Item_start.apply(this, arguments);

    if (this._categoryWindow) {
        const hasFavoriteItems = $gameParty.favoriteItems().length > 0;

        if (ItemFavoriteActionParams.selectFavoriteCategory && hasFavoriteItems) {
            this._categoryWindow.selectSymbol('favorite');
        } else if (ItemFavoriteActionParams.favoritesCommandPosition === 'first' && !hasFavoriteItems) {
            this._categoryWindow.select(1);
        }
    }
};

//===========================================================================
// Window_ItemCategory
//===========================================================================

const ItemFavoriteAction_Window_ItemCategory_maxCols =
    Window_ItemCategory.prototype.maxCols;
Window_ItemCategory.prototype.maxCols = function() {
    let maxCols = ItemFavoriteAction_Window_ItemCategory_maxCols.apply(this, arguments);

    if (this.needsCommand('favorite')) {
        maxCols++;
    }

    return maxCols;
};

const ItemFavoriteAction_Window_ItemCategory_needsCommand =
    Window_ItemCategory.prototype.needsCommand;
Window_ItemCategory.prototype.needsCommand = function(name) {
    if (name === 'favorite') {
        return SceneManager._scene instanceof Scene_Item;
    }

    return ItemFavoriteAction_Window_ItemCategory_needsCommand.apply(this, arguments);
};

const ItemFavoriteAction_Window_ItemCategory_makeCommandList =
    Window_ItemCategory.prototype.makeCommandList;
Window_ItemCategory.prototype.makeCommandList = function() {
    const isFirstPosition = ItemFavoriteActionParams.favoritesCommandPosition === 'first';

    if (isFirstPosition && this.needsCommand('favorite')) {
        this.addFavoritesCommand();
    }

    ItemFavoriteAction_Window_ItemCategory_makeCommandList.apply(this, arguments);

    if (!isFirstPosition && this.needsCommand('favorite')) {
        this.addFavoritesCommand();
    }
};

Window_ItemCategory.prototype.addFavoritesCommand = function() {
    const favoriteItems = $gameParty.favoriteItems();
    let commandName = ItemFavoriteActionParams.favoritesCommandName;

    if (ItemFavoriteActionParams.showFavoritesCount) {
        commandName += ` (${favoriteItems.length})`;
    }

    this.addCommand(commandName, 'favorite', favoriteItems.length > 0);
};

//===========================================================================
// Window_ItemList
//===========================================================================

const ItemFavoriteAction_Window_ItemList_includes =
    Window_ItemList.prototype.includes;
Window_ItemList.prototype.includes = function(item) {
    if (this._category === 'favorite') {
        return $gameParty.isFavoriteItem(item);
    }

    return ItemFavoriteAction_Window_ItemList_includes.apply(this, arguments);
};

//===========================================================================
// Window_ItemActions
//===========================================================================

const ItemFavoriteAction_Window_ItemActions_addOriginalCommands =
    Window_ItemActions.prototype.addOriginalCommands;
Window_ItemActions.prototype.addOriginalCommands = function() {
    ItemFavoriteAction_Window_ItemActions_addOriginalCommands.apply(this, arguments);

    const commandName = $gameParty.favoriteItems().includes(this._item) ?
        ItemFavoriteActionParams.removeFavoriteCommandName : ItemFavoriteActionParams.addFavoriteCommandName;

    this.addAction(commandName, { symbol: 'favorite', categories: ['item', 'weapon', 'armor'] });
};
