import { ActionController, registerAction } from './ActionController';
import { Args } from '../Command';
import { Task } from '../Queue/TaskQueue';
import { grabVillageResources, grabVillageResourceStorage } from '../Page/ResourcesBlock';
import { changeHeroResource, grabCurrentHeroResource } from '../Page/HeroPage';
import { grabActiveVillageId } from '../Page/VillageBlock';
import { HeroState } from '../State/HeroState';
import { calcHeroResource } from '../Core/HeroBalance';
import { HeroAllResources } from '../Core/Hero';

@registerAction
export class BalanceHeroResourcesAction extends ActionController {
    async run(args: Args, task: Task): Promise<any> {
        const activeVillageId = grabActiveVillageId();
        const heroVillageId = new HeroState().getVillageId();

        if (heroVillageId === undefined || activeVillageId !== heroVillageId) {
            changeHeroResource(HeroAllResources);
            return;
        }

        const resources = grabVillageResources();
        const requiredResources = this.scheduler.getVillageRequiredResources(heroVillageId);
        const totalRequiredResources = this.scheduler.getTotalVillageRequiredResources(heroVillageId);
        const storage = grabVillageResourceStorage();
        const currentType = grabCurrentHeroResource();

        const heroType = calcHeroResource(resources, requiredResources, totalRequiredResources, storage);

        if (heroType !== currentType) {
            changeHeroResource(heroType);
        }
    }
}