package emu.grasscutter.server.packet.send;

import java.util.List;

import emu.grasscutter.data.common.ItemParamData;
import emu.grasscutter.game.gacha.GachaBanner;
import emu.grasscutter.game.gacha.PlayerGachaBannerInfo;
import emu.grasscutter.net.packet.BasePacket;
import emu.grasscutter.net.packet.PacketOpcodes;
import emu.grasscutter.net.proto.DoGachaRspOuterClass.DoGachaRsp;
import emu.grasscutter.net.proto.GachaItemOuterClass.GachaItem;
import emu.grasscutter.net.proto.RetcodeOuterClass.Retcode;
import emu.grasscutter.net.proto.RetcodeOuterClass;

public class PacketDoGachaRsp extends BasePacket {
	
	public PacketDoGachaRsp(GachaBanner banner, List<GachaItem> list, PlayerGachaBannerInfo gachaInfo) {
		super(PacketOpcodes.DoGachaRsp);

		ItemParamData costItem = banner.getCost(1);
		ItemParamData costItem10 = banner.getCost(10);
		int gachaTimesLimit = banner.getGachaTimesLimit();
		int leftGachaTimes = switch(gachaTimesLimit) {
			case Integer.MAX_VALUE -> Integer.MAX_VALUE;
			default -> Math.max(gachaTimesLimit - gachaInfo.getTotalPulls(), 0);
		};
		DoGachaRsp.Builder rsp = DoGachaRsp.newBuilder()
				.setGachaType(banner.getGachaType())
				.setGachaScheduleId(banner.getScheduleId())
				.setGachaTimes(list.size())
				.setNewGachaRandom(12345)
				.setLeftGachaTimes(leftGachaTimes)
	            .setGachaTimesLimit(gachaTimesLimit)
				.setCostItemId(costItem.getId())
	            .setCostItemNum(costItem.getCount())
	            .setTenCostItemId(costItem10.getId())
	            .setTenCostItemNum(costItem10.getCount())
	            .addAllGachaItemList(list);

		if(banner.hasEpitomized()) {
			rsp.setWishItemId(gachaInfo.getWishItemId())
				.setWishProgress(gachaInfo.getFailedChosenItemPulls())
				.setWishMaxProgress(banner.getWishMaxProgress());
		}
		
		this.setData(rsp.build());
	}

	public PacketDoGachaRsp() {
		super(PacketOpcodes.DoGachaRsp);

		DoGachaRsp p = DoGachaRsp.newBuilder()
				.setRetcode(RetcodeOuterClass.Retcode.RET_SVR_ERROR_VALUE)
				.build();
		
		this.setData(p);
	}

	public PacketDoGachaRsp(Retcode retcode) {
		super(PacketOpcodes.DoGachaRsp);

		DoGachaRsp p = DoGachaRsp.newBuilder()
				.setRetcode(retcode.getNumber())
				.build();

		this.setData(p);
	}
}
