import uuid
import json
import gradio as gr
from datetime import datetime
import urllib.parse
import pytz



class SubmissionService:
    def __init__(self, gcs_service):
        self.gcs_service = gcs_service
        self.bucket_name = "ai_assignment_submission"

    def create_submission_id(self):
        while True:
            submission_id = str(uuid.uuid4())
            file_name = f"submissions/{submission_id}.json"
            if not self.gcs_service.check_file_exists(self.bucket_name, file_name):
                return submission_id

    def submit_assignment(self, assignment_id, student_id, student_name, submission_content, file_name=None, bucket_name=None):
        submission_id = self.create_submission_id()
        timestamp_now = datetime.now(pytz.utc).astimezone(pytz.timezone('Asia/Taipei')).strftime("%Y-%m-%d %H:%M:%S")
        submission_data = {
            "file_name": file_name,
            "bucket_name": bucket_name,
            "content": submission_content
        }
        submission_data = {
            "submission_id": submission_id,
            "assignment_id": assignment_id,
            "student_id": student_id,
            "student_name": student_name,
            "submission_data": submission_data,
            "timestamp": timestamp_now
        }

        self.save_submission_to_gcs(submission_data)
        self.save_user_submissions_to_gcs(student_id, submission_data)
        self.update_assignment_submission_ids(assignment_id, submission_id)

        return f"作業已收到,學生ID:{student_id}"
    
    def update_assignment_submission_ids(self, assignment_id, submission_id):
        try:
            assignment_data = self.get_assignment_data(assignment_id)
            if assignment_data:
                if "submission_ids" not in assignment_data:
                    assignment_data["submission_ids"] = []
                assignment_data["submission_ids"].append(submission_id)
                file_name = f"assignments/{assignment_id}.json"
                self.gcs_service.upload_json_string(self.bucket_name, file_name, json.dumps(assignment_data))
        except Exception as e:
            print(f"更新作業提交ID時出錯:{e}")

    def get_assignment_data(self, assignment_id):
        try:
            file_name = f"assignments/{assignment_id}.json"
            assignment_json = self.gcs_service.download_as_string(self.bucket_name, file_name)
            assignment_data = json.loads(assignment_json)
        except Exception as e:
            print(f"Error: {e}")
            return None
        return assignment_data

    def save_submission_to_gcs(self, submission_data):
        file_name = f"submissions/{submission_data['submission_id']}.json"
        self.gcs_service.upload_json_string(self.bucket_name, file_name, json.dumps(submission_data))

    def save_user_submissions_to_gcs(self, student_id, submission_data):
        encoded_student_id_url = urllib.parse.quote(student_id, safe='')
        try:
            user_submissions_json = self.gcs_service.download_as_string(self.bucket_name, f"users/{encoded_student_id_url}/submissions.json")
            user_submissions = json.loads(user_submissions_json)
        except Exception as e:
            print(f"Error: {e}")
            user_submissions = {}

        submission_id = submission_data['submission_id']
        assignment_id = submission_data['assignment_id']
        assignment_data = self.get_assignment_data(assignment_id)
        user_submissions[submission_id] = {
            "assignment_id": submission_data['assignment_id'],
            "assignment_name": assignment_data["metadata"]["topic"],
            "assignment_type": assignment_data["assignment_type"],
            "timestamp": submission_data['timestamp'],
        }
        self.gcs_service.upload_json_string(self.bucket_name, f"users/{encoded_student_id_url}/submissions.json", json.dumps(user_submissions))

    def get_submission_from_gcs(self, submission_id):
        try:
            file_name = f"submissions/{submission_id}.json"
            submission_json = self.gcs_service.download_as_string(self.bucket_name, file_name)
            submission_data = json.loads(submission_json)
        except Exception as e:
            print(f"Error: {e}")
            return None
        return submission_data

    def list_submissions(self):
        # 列出所有提交的作业
        try:
            prefix = "submissions/"
            blobs = self.gcs_service.list_files(self.bucket_name, prefix)
            submission_ids = [blob.name.split("/")[-1].replace(".json", "") for blob in blobs]
            return submission_ids
        except Exception as e:
            print(f"Error: {e}")
            return []

    def get_student_submissions_list(self, student_id):
        try:
            encoded_student_id_url = urllib.parse.quote(student_id, safe='')
            user_submissions_json = self.gcs_service.download_as_string(self.bucket_name, f"users/{encoded_student_id_url}/submissions.json")
            user_submissions = json.loads(user_submissions_json)
        except Exception as e:
            print(f"Error: {e}")
            return {}
        return user_submissions
    
    def update_submission_list(self, student_id):
        choices = []
        user_submissions = self.get_student_submissions_list(student_id)
        for submission_id, submission in user_submissions.items():
            topic = submission.get("assignment_name", "未命名作业")
            choice = (topic, submission_id)
            choices.append(choice)
        return gr.update(choices=choices)

    def get_student_submissions(self, student_id):
        submission_ids = self.list_submissions()
        for submission_id in submission_ids:
            submission_data = self.get_submission_from_gcs(submission_id)
            if submission_data and submission_data.get("student_id") == student_id:
                return submission_data["submission"]
        return "未找到學生提交的作業"