(function(Scratch) {
    'use strict';
    
    class MorganMailExtension {
        constructor() {
            // 使用EmailJS作为邮件发送服务
            this.emailjsUserId = '';
            this.emailjsServiceId = '';
            this.emailjsTemplateId = '';
            this.isInitialized = false;
            
            this.colors = {
                primary: '#2E7D32',
                secondary: '#1B5E20',
                accent: '#4CAF50'
            };
        }
        
        getInfo() {
            return {
                id: 'Mmail',
                name: 'Morgan的邮件发送',
                color1: this.colors.primary,
                color2: this.colors.secondary,
                color3: this.colors.accent,
                docsURI: 'https://www.emailjs.com/docs/',
                blocks: [
                    {
                        opcode: 'initializeEmailService',
                        blockType: Scratch.BlockType.COMMAND,
                        text: '初始化邮件服务 UserID:[USER_ID] ServiceID:[SERVICE_ID] TemplateID:[TEMPLATE_ID]',
                        arguments: {
                            USER_ID: {
                                type: Scratch.ArgumentType.STRING,
                                defaultValue: 'your_user_id'
                            },
                            SERVICE_ID: {
                                type: Scratch.ArgumentType.STRING,
                                defaultValue: 'your_service_id'
                            },
                            TEMPLATE_ID: {
                                type: Scratch.ArgumentType.STRING,
                                defaultValue: 'your_template_id'
                            }
                        }
                    },
                    '---',
                    {
                        opcode: 'sendEmail',
                        blockType: Scratch.BlockType.COMMAND,
                        text: '发送邮件 发件人:[FROM_EMAIL] 收件人:[TO_EMAIL] 主题:[SUBJECT] 内容:[CONTENT]',
                        arguments: {
                            FROM_EMAIL: {
                                type: Scratch.ArgumentType.STRING,
                                defaultValue: 'sender@example.com'
                            },
                            TO_EMAIL: {
                                type: Scratch.ArgumentType.STRING,
                                defaultValue: 'receiver@example.com'
                            },
                            SUBJECT: {
                                type: Scratch.ArgumentType.STRING,
                                defaultValue: 'Hello from Scratch!'
                            },
                            CONTENT: {
                                type: Scratch.ArgumentType.STRING,
                                defaultValue: '这是一封来自Scratch的测试邮件。'
                            }
                        }
                    },
                    {
                        opcode: 'sendEmailWithName',
                        blockType: Scratch.BlockType.COMMAND,
                        text: '发送邮件(带姓名) 发件人:[FROM_EMAIL] 发件人名:[FROM_NAME] 收件人:[TO_EMAIL] 收件人名:[TO_NAME] 主题:[SUBJECT] 内容:[CONTENT]',
                        arguments: {
                            FROM_EMAIL: {
                                type: Scratch.ArgumentType.STRING,
                                defaultValue: 'sender@example.com'
                            },
                            FROM_NAME: {
                                type: Scratch.ArgumentType.STRING,
                                defaultValue: '发件人'
                            },
                            TO_EMAIL: {
                                type: Scratch.ArgumentType.STRING,
                                defaultValue: 'receiver@example.com'
                            },
                            TO_NAME: {
                                type: Scratch.ArgumentType.STRING,
                                defaultValue: '收件人'
                            },
                            SUBJECT: {
                                type: Scratch.ArgumentType.STRING,
                                defaultValue: 'Hello from Scratch!'
                            },
                            CONTENT: {
                                type: Scratch.ArgumentType.STRING,
                                defaultValue: '这是一封来自Scratch的测试邮件。'
                            }
                        }
                    },
                    '---',
                    {
                        opcode: 'isServiceInitialized',
                        blockType: Scratch.BlockType.BOOLEAN,
                        text: '邮件服务已初始化?',
                        disableMonitor: true
                    },
                    {
                        opcode: 'getLastSendStatus',
                        blockType: Scratch.BlockType.REPORTER,
                        text: '上次发送状态',
                        disableMonitor: true
                    },
                    {
                        opcode: 'validateEmail',
                        blockType: Scratch.BlockType.BOOLEAN,
                        text: '邮箱地址 [EMAIL] 有效?',
                        arguments: {
                            EMAIL: {
                                type: Scratch.ArgumentType.STRING,
                                defaultValue: 'test@example.com'
                            }
                        }
                    }
                ]
            };
        }
        
        initializeEmailService(args) {
            this.emailjsUserId = args.USER_ID.trim();
            this.emailjsServiceId = args.SERVICE_ID.trim();
            this.emailjsTemplateId = args.TEMPLATE_ID.trim();
            
            if (this.emailjsUserId && this.emailjsServiceId && this.emailjsTemplateId) {
                this.isInitialized = true;
                console.log('邮件服务初始化成功');
                return '邮件服务初始化成功';
            } else {
                this.isInitialized = false;
                console.log('邮件服务初始化失败:参数不完整');
                return '初始化失败:请检查所有参数';
            }
        }
        
        isServiceInitialized() {
            return this.isInitialized;
        }
        
        getLastSendStatus() {
            return this.lastSendStatus || '尚未发送邮件';
        }
        
        validateEmail(args) {
            const email = args.EMAIL.trim();
            // 简单的邮箱格式验证
            const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
            return emailRegex.test(email);
        }
        
        sendEmail(args) {
            if (!this.isInitialized) {
                this.lastSendStatus = '错误:请先初始化邮件服务';
                console.error(this.lastSendStatus);
                return this.lastSendStatus;
            }
            
            const fromEmail = args.FROM_EMAIL.trim();
            const toEmail = args.TO_EMAIL.trim();
            const subject = args.SUBJECT.trim();
            const content = args.CONTENT.trim();
            
            // 验证邮箱格式
            if (!this.validateEmail({EMAIL: fromEmail})) {
                this.lastSendStatus = '错误:发件人邮箱格式无效';
                return this.lastSendStatus;
            }
            
            if (!this.validateEmail({EMAIL: toEmail})) {
                this.lastSendStatus = '错误:收件人邮箱格式无效';
                return this.lastSendStatus;
            }
            
            // 使用EmailJS发送邮件
            const templateParams = {
                from_email: fromEmail,
                to_email: toEmail,
                subject: subject,
                message: content,
                from_name: 'Scratch用户',
                to_name: '收件人'
            };
            
            return this.sendEmailJS(templateParams);
        }
        
        sendEmailWithName(args) {
            if (!this.isInitialized) {
                this.lastSendStatus = '错误:请先初始化邮件服务';
                console.error(this.lastSendStatus);
                return this.lastSendStatus;
            }
            
            const fromEmail = args.FROM_EMAIL.trim();
            const fromName = args.FROM_NAME.trim();
            const toEmail = args.TO_EMAIL.trim();
            const toName = args.TO_NAME.trim();
            const subject = args.SUBJECT.trim();
            const content = args.CONTENT.trim();
            
            // 验证邮箱格式
            if (!this.validateEmail({EMAIL: fromEmail})) {
                this.lastSendStatus = '错误:发件人邮箱格式无效';
                return this.lastSendStatus;
            }
            
            if (!this.validateEmail({EMAIL: toEmail})) {
                this.lastSendStatus = '错误:收件人邮箱格式无效';
                return this.lastSendStatus;
            }
            
            // 使用EmailJS发送邮件
            const templateParams = {
                from_email: fromEmail,
                from_name: fromName,
                to_email: toEmail,
                to_name: toName,
                subject: subject,
                message: content
            };
            
            return this.sendEmailJS(templateParams);
        }
        
        sendEmailJS(templateParams) {
            // 动态加载EmailJS库
            return new Promise((resolve) => {
                // 检查是否已加载EmailJS
                if (typeof emailjs === 'undefined') {
                    // 动态加载EmailJS SDK
                    const script = document.createElement('script');
                    script.src = 'https://cdn.jsdelivr.net/npm/@emailjs/browser@3/dist/email.min.js';
                    script.onload = () => {
                        this.initializeAndSendEmail(templateParams, resolve);
                    };
                    script.onerror = () => {
                        this.lastSendStatus = '错误:加载邮件服务失败';
                        resolve(this.lastSendStatus);
                    };
                    document.head.appendChild(script);
                } else {
                    this.initializeAndSendEmail(templateParams, resolve);
                }
            });
        }
        
        initializeAndSendEmail(templateParams, resolve) {
            try {
                // 初始化EmailJS
                emailjs.init(this.emailjsUserId);
                
                // 发送邮件
                emailjs.send(this.emailjsServiceId, this.emailjsTemplateId, templateParams)
                    .then((response) => {
                        this.lastSendStatus = `成功:邮件已发送 (状态: ${response.status})`;
                        console.log('邮件发送成功:', response);
                        resolve(this.lastSendStatus);
                    })
                    .catch((error) => {
                        this.lastSendStatus = `错误:发送失败 - ${error.text || error.message}`;
                        console.error('邮件发送失败:', error);
                        resolve(this.lastSendStatus);
                    });
            } catch (error) {
                this.lastSendStatus = `错误:发送过程异常 - ${error.message}`;
                console.error('邮件发送异常:', error);
                resolve(this.lastSendStatus);
            }
        }
    }
    
    // 注册扩展
    Scratch.extensions.register(new MorganMailExtension());
})(Scratch);