import os
import shutil
from fastapi import BackgroundTasks, File, HTTPException, UploadFile
from fastapi_mail import ConnectionConfig, FastMail, MessageSchema
from sqlalchemy.orm import Session
from app.locale.messages import Messages
from app.models.main.group import TblGroup
from app.models.main.send_mail import SendMailBase, TblSendMail
from app.models.main.simulation import TblSimulation
from app.models.main.student import TblStudent
from app.models.main.user import TblUser
from app.models.main.user_simulation import TblUserSimulation
from app.utils.schemas_utils import CustomResponse
from app.api.send_mail.schema import SendMailCreate
from app.dependency.authantication import JWTPayloadSchema

class SendMailService:
    def __init__(self, db: Session,token:JWTPayloadSchema):
        self.db = db
        self.token = token
    
    async def created_data(self, request:SendMailCreate, background_tasks: BackgroundTasks, attach_file:UploadFile = File(None)):
        image_path = None
        if attach_file and attach_file.filename:
            image_filename = attach_file.filename
            image_path = f"uploads/{image_filename}"
            os.makedirs("uploads", exist_ok=True)
            with open(image_path, "wb") as buffer:
                shutil.copyfileobj(attach_file.file, buffer)
        validated_data = SendMailBase.model_validate(request.model_dump())
        validated_data.attach_file = image_path
        create = TblSendMail.create_data(validated_data, self.db)
        get_user_id = self.db.query(TblUserSimulation).filter(TblUserSimulation.user_id == self.token.user_id).first()
        get_user_data = self.db.query(TblUser).filter(TblUser.user_id == get_user_id.user_id).first()
        get_simulation_code = self.db.query(TblSimulation).filter(TblSimulation.simulation_id == get_user_id.simulation_id).first()
        create.simulation_code = get_simulation_code.simulation_code
        get_group_code = self.db.query(TblGroup).filter(TblGroup.simulation_code == get_simulation_code.simulation_code).first()
        create.group_code = get_group_code.group_code
        get_student_data = self.db.query(TblStudent.student_email).filter(TblStudent.group_code == get_group_code.group_code).all()
        self.db.commit()
        conf = ConnectionConfig(
                MAIL_USERNAME=get_user_data.email_id,
                MAIL_PASSWORD=get_user_data.password,
                MAIL_FROM=get_user_data.email_id,
                MAIL_SERVER="smtp.stackmail.com",
                MAIL_PORT=465,
                MAIL_SSL_TLS=True,         
                MAIL_STARTTLS=False,        
                USE_CREDENTIALS=True,
                VALIDATE_CERTS=True
            )
        fm = FastMail(conf)
        subject = request.subject
        body = request.body
        for data in get_student_data:
            email = data[0]
            message = MessageSchema(
                    subject=subject,
                    recipients=[email],
                    body=body,
                    subtype="plain" 
            )
            background_tasks.add_task(fm.send_message, message)
        return CustomResponse(status="1", message=Messages.SEND_MAIL)
    
    async def get_admin_student_email(self, group_code:str):
        get_user = self.db.query(TblUser).filter(TblUser.user_id == self.token.user_id).first()
        if not get_user:
            raise HTTPException(status_code=404, detail="User not found")
        get_student = self.db.query(TblStudent).filter(TblStudent.group_code == group_code).all()
        student_emails = [s.student_email.strip() for s in get_student if s.student_email]
        return {
        "user_email": get_user.email_id,  
        "student_emails": student_emails  
        }
        