from django.contrib.auth.models import User
from django.db import models
import threading
import time

class Order(models.Model):
    order_datetime = models.DateTimeField(auto_now_add=True)  # Дата и время создания заказа
    user = models.ForeignKey(User, on_delete=models.CASCADE)  # Связь с пользователем
    order_parameters = models.TextField(default='no parameters')  # Параметры заказа
    file_path = models.CharField(max_length=255, blank=True, null=True)  # Путь к файлу
    order_state = models.CharField(max_length=50, default='wait_confirmation')  # Состояние заказа

    def __str__(self):
        return f"Order {self.id} for {self.user.username}"
    
class EditRequest(models.Model):
    req_datetime = models.DateTimeField(auto_now_add=True)  # Дата и время создания заказа
    user = models.ForeignKey(User, on_delete=models.CASCADE)  # Связь с пользователем
    req_parameters = models.TextField(default='no parameters')  # Параметры заказа
    file_path = models.CharField(max_length=255, blank=True, null=True)  # Путь к файлу
    req_state = models.CharField(
        max_length=50, 
        default='wait_confirmation', 
        choices=[
            ('wait_confirmation', 'Ожидание подтверждения'),
            ('in_progress', 'В работе'),
            ('ready', 'Готово'),
            ('error', 'Ошибка'),
        ]
    )  # Состояние заказа
    received_file = models.CharField(max_length=255, blank=True, null=True)  # Полученный файл от сервера

    def __str__(self):
        return f"Edit Request {self.id} for {self.user.username}"

    def save(self, *args, **kwargs):
        # Сохраняем объект
        is_new = self.pk is None
        super().save(*args, **kwargs)

        # Если это новый объект, запускаем фоновую задачу
        if is_new:
            threading.Thread(target=self.send_request_to_server, args=(), daemon=True).start()

    def send_request_to_server(self):
        # Заглушка для отправки данных на сервер
        print(f"Начало отправки данных для заявки {self.id}")
        time.sleep(5)  # Симуляция задержки
        print(f"Данные для заявки {self.id} отправлены на сервер.")

class IncomingEditRequest(models.Model):
    related_request = models.OneToOneField(
        EditRequest, 
        on_delete=models.CASCADE, 
        related_name='incoming_request'
    )  # Связь с исходной заявкой
    response_datetime = models.DateTimeField(auto_now_add=True)  # Время получения ответа
    server_response = models.TextField()  # Ответ от сервера
    result_file_path = models.CharField(max_length=255, blank=True, null=True)  # Путь к полученному файлу
    status = models.CharField(
        max_length=50, 
        choices=[
            ('ready', 'Готово'),
            ('error', 'Ошибка'),
        ]
    )  # Статус результата

    def __str__(self):
        return f"Incoming Edit Request for {self.related_request}"

class Storage(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    item_name = models.CharField(max_length=255)
    file_path = models.CharField(max_length=255, default='')
    description = models.TextField(blank=True)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.item_name
    


class OrderArchive(models.Model):
    order_datetime = models.DateTimeField(auto_now_add=True)  # Дата и время создания заказа
    user = models.ForeignKey(User, on_delete=models.CASCADE)  # Связь с пользователем
    order_parameters = models.TextField(default='no parameters')  # Параметры заказа
    file_path = models.CharField(max_length=255, blank=True, null=True)  # Путь к файлу
    order_state = models.CharField(max_length=50, default='wait_confirmation')  # Состояние заказа

    def __str__(self):
        return f"Order {self.id} for {self.user.username}"
    



class APIKey(models.Model):
    key = models.CharField(max_length=40, unique=True)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.key
    


class Incoming(models.Model):
    order = models.OneToOneField(Order, on_delete=models.CASCADE)  # Связь с заказом
    processed_datetime = models.DateTimeField(auto_now_add=True)  # Дата и время обработки заказа
    job_state = models.CharField(max_length=50, default='success')  # Состояние заказа

    def __str__(self):
        return f"Incoming record for Order {self.order.id}"