import { _decorator, Node, tween, Vec3, Sprite, Asset, ImageAsset, SpriteFrame, Texture2D, Label } from 'cc';
import BaseView from '../../../../../../extensions/app/assets/base/BaseView';
import { PageTips } from '../../tips/native/PageTips';
import { app } from 'db://assets/app/app';
import { Tools } from 'db://assets/res-native/tools/Tools';
import { PageRewardhistory } from '../../rewardhistory/native/PageRewardhistory';
import { USERDATA } from 'db://assets/res-native/data/UserData';
const { ccclass, property } = _decorator;
@ccclass('PageMain')
export class PageMain extends BaseView {
    /** 标题 */
    @property(Node)
    title: Node = null!;
    /** 奖励 */
    @property(Node)
    reward_bg: Node = null!;
    /** 奖励 */
    @property(Node)
    noreward_bg: Node = null!;
    /** 音乐按钮 */
    @property(Node)
    btn_music: Node = null!;
    /** 灯光 */
    @property(Node)
    turn_light: Node = null!;
    /** 转盘 */
    @property(Node)
    turn: Node = null!;
    /** 奖励文字 */
    @property(Label)
    lab_rw: Label = null!;
    /** 奖励icon */
    @property(Sprite)
    icon_rw: Sprite = null!;
    /** 剩余次数 */
    @property(Label)
    lab_remain: Label = null!;
    /** 奖励展示列表 */
    @property(Node)
    rw_list: Node[] = [];
    /** 奖励icon */
    @property(Sprite)
    game_logo: Sprite = null!;
    /** 奖励icon */
    @property(Sprite)
    game_logo_bg: Sprite = null!;
    /** 当前分数 */
    @property(Label)
    lab_point: Label = null!;

    /** 转盘是否正在转 */
    private _is_turing = false;

    // 初始化的相关逻辑写在这
    onLoad() {}

    // 界面打开时的相关逻辑写在这(onShow可被多次调用-它与onHide不成对)
    onShow(params: any) {
        this.titleAnimation();
        this.lab_remain.string = "REMAINING CHANCE : " + USERDATA.point.toString();
        this.lab_point.string = USERDATA.prize_amount.toString();

        this.setRw();

                // 加载配置的logo
        if (USERDATA.logo && this.game_logo) {
            Tools.remoteLoadSprite(USERDATA.logo, this.game_logo)
        }

        if (USERDATA.logo_back && this.game_logo_bg) {
            Tools.remoteLoadSprite(USERDATA.logo_back, this.game_logo_bg)
        }
    }

    setRw(){
        for (let i = 0; i < this.rw_list.length; i++) {
            const element = this.rw_list[i];
            if (USERDATA.prize_list[i]){
                Tools.SetText(element, USERDATA.prize_list[i].name)
                Tools.remoteLoadSprite(USERDATA.prize_list[i].pic, Tools.GetChildComp(element, "icon", Sprite))
            }
        }
    }

    /** 开始灯光切换 */
    startLightToggle() {
        this.schedule(this.switchLight, 0.3);
    }

    /** 切换灯光 */
    switchLight(){
        this.turn_light.active = !this.turn_light.active;
    }   

    /** 标题动画 */
    titleAnimation() {
        const scaleDown = tween().to(0.6, { scale: new Vec3(0.96, 0.96, 1) });
        const scaleUp = tween().to(0.6, { scale: new Vec3(1, 1, 1) });
        
        tween(this.title)
            .sequence(scaleDown, scaleUp)  // 使用sequence串联动画
            .repeatForever()
            .start();
    }


    // 界面关闭时的相关逻辑写在这(已经关闭的界面不会触发onHide)
    onHide(result: undefined) {
        // app.manager.ui.show<PageMain>({name: 'PageMain', onHide:(result) => { 接收到return的数据，并且有类型提示 }})
        return result;
    }


    /**
     * 旋转转盘
     * @param segmentIndex 目标段落索引 (0-9)
     * @param callback 旋转完成后的回调函数
     */
    rotateTurntable(segmentIndex: number, callback?: () => void) {
        app.manager.sound.playEffect({name: "effect/turn"})
        this._is_turing = true;
        // 每个扇形的角度
        const segmentAngle = 36; // 360度 / 10份 = 36度每份
        // 随机左右12度
        let random_rat = 12 * (1 - Math.random() * 2)
        
        // 计算目标角度（从15度开始，顺时针）
        // segmentIndex: 0-9 对应第1-10个扇形
        const targetAngle = (18 + segmentIndex * segmentAngle) + random_rat;
        
        // 为了让转盘看起来更真实，我们先旋转几圈再停到目标位置
        const rotations = Math.floor(Math.random() * 3) + 6; // 旋转圈数
        const totalRotation = rotations * 360 + targetAngle;
        
        // 获取当前旋转角度
        const currentRotation = this.turn.eulerAngles;
        
        // 计算需要旋转的总角度
        const rotationAngle = totalRotation - currentRotation.z;
        
        // 使用tween动画旋转转盘
        tween(this.turn)
            .by(2.2, { eulerAngles: new Vec3(0, 0, rotationAngle) }, {
                easing: 'cubicOut' // 使用缓动函数使旋转更自然
            })
            .call(() => {
                // 确保最终角度正确
                this.turn.eulerAngles = new Vec3(0, 0, targetAngle);
                if (callback) callback();
            })
            .start();
    }

    /** 点击奖励确定 */
    onClickRewardSure(){
        this.reward_bg.active = false
        this.noreward_bg.active = false
    }

    /** 点击提示 */
    onClickTips(){
        app.manager.ui.show<PageTips>({name: 'PageTips'})
    }

    /** 点击音乐 */
    oncClickMusic(){
        let music = app.manager.sound.isMusicPlaying
        music ? app.manager.sound.stopMusic() : app.manager.sound.playDefaultMusic()
        this.loadRes(music ? "main_btn_sounds_off" : "main_btn_sounds_on", Asset, (res: ImageAsset)=>{
            let sp = new SpriteFrame()
            let tex = new Texture2D();
            tex.image = res;
            sp.texture = tex
            this.btn_music.getComponent(Sprite).spriteFrame = sp
        });
    }

    /** 点击历史 */
    onClickRwHis(){
        app.manager.ui.show<PageRewardhistory>({name: 'PageRewardhistory'})
    }

    /** 点击领取奖励 */
    onClaimPrize(){
        Tools.httpReq("claim-prize", {}, (res:any) => {
            app.manager.ui.showToast(Tools.GetLocalized("get success"))
            USERDATA.prize_amount = 0
            this.lab_point.string = USERDATA.prize_amount.toString();
        }, (err:any) => {
            app.manager.ui.showToast(Tools.GetLocalized("get fail"))
        })
    }

    /** 点击转盘 */
    btnClickTurn(){
        if (this._is_turing) return;
        if (USERDATA.point <= 0) {
            app.manager.ui.showToast(Tools.GetLocalized("no chance"));
            return;
        }

        this.icon_rw.spriteFrame = null;

        Tools.httpReq("lottery", {}, (res:any)=>{
            this.startLightToggle(); // 启动灯光切换
            this.turn.setPosition(new Vec3(0, 0, 18))

            let n = null
            for (let i = 0; i < USERDATA.prize_list.length; i++) {
                const element = USERDATA.prize_list[i];
                if (res.prize_id == element.id){
                    n = i
                    break
                }
            }

            if (n == null){
                app.manager.ui.showToast(Tools.GetLocalized("fail"))
                return
            }

            USERDATA.point--
            USERDATA.prize_amount = res.total_amount
            this.lab_remain.string = "REMAINING CHANCE : " + USERDATA.point.toString()

            this.rotateTurntable(n, ()=>{
                this.lab_point.string = USERDATA.prize_amount.toString();
                this._is_turing = false
                this.lab_rw.string = Tools.StringLFormat(res.message)
                Tools.remoteLoadSprite(USERDATA.prize_list[n].pic, this.icon_rw)
                this.unschedule(this.switchLight)
                this.scheduleOnce(()=>{
                    this.reward_bg.active = res.prize_type != 3
                    this.noreward_bg.active = res.prize_type == 3
                    app.manager.sound.playEffect({name: res.prize_type == 3 ? "effect/lose" : "effect/win"})
                }, 0.3)
            })
        })
    }
}