from django.db import models
import os
import uuid
from django.db import models


def get_file_path(instance, filename):
    ext = filename.split('.')[-1] # پسوند فایل را جدا می‌کند (مثلا png)
    filename = f"{uuid.uuid4()}.{ext}" # نام فایل را به یک کد مثل 550e8400.png تغییر می‌دهد
    return os.path.join('food/pics/', filename)
# Create your models here.

def get_file_path_title(instance, filename):
    ext = filename.split('.')[-1] # پسوند فایل را جدا می‌کند (مثلا png)
    filename = f"{uuid.uuid4()}.{ext}" # نام فایل را به یک کد مثل 550e8400.png تغییر می‌دهد
    return os.path.join('title/', filename)
# Create your models here.


def get_file_path_logo(instance, filename):
    ext = filename.split('.')[-1] # پسوند فایل را جدا می‌کند (مثلا png)
    filename = f"{uuid.uuid4()}.{ext}" # نام فایل را به یک کد مثل 550e8400.png تغییر می‌دهد
    return os.path.join('logo/', filename)
# Create your models here.



from django.contrib.auth.models import AbstractUser

class CoffeShops(models.Model):
    name = models.CharField(max_length=100)
    slug = models.SlugField(unique=True)

    def __str__(self):
        return self.name
class CustomUser(AbstractUser):

    ROLE_MANAGER = 'manager'
    ROLE_ACCOUNTANT = 'accountant'
    ROLE_WAITER = 'waiter'
    ROLE_CUSTOMER = 'customer'

    ROLE_CHOICES = [
        (ROLE_MANAGER, 'مدیر کافه'),
        (ROLE_ACCOUNTANT, 'حسابدار'),
        (ROLE_WAITER, 'ویتر'),
        (ROLE_CUSTOMER , 'مشتری')
    ]


    phone = models.CharField(max_length=11, verbose_name="شماره تماس")
    email = models.EmailField(null=True, blank=True, verbose_name="ایمیل")
    birth_date = models.DateField(null=True, blank=True, verbose_name="تاریخ تولد")
    visit_count = models.PositiveIntegerField(default=1, verbose_name="تعداد دفعات مراجعه")
    last_visit = models.DateTimeField(auto_now=True, verbose_name="آخرین بازدید")
    is_club_member = models.BooleanField(default=True, verbose_name="عضو باشگاه")
    cofe_owner = models.ForeignKey(to=CoffeShops , on_delete=models.CASCADE , null=True , blank=True , verbose_name='نام کافه')
    role = models.CharField(
    max_length=20,
    choices=ROLE_CHOICES,
    default=ROLE_CUSTOMER,
    verbose_name="نقش کاربر"
    )



    # USERNAME_FIELD = 'phone' # ورود با شماره موبایل
    # REQUIRED_FIELDS = ['username']

    def __str__(self):
        return f"{self.phone} - {self.get_role_display()}"


    @property
    def is_staff_finance(self):
        return self.role in ['manager','accountant']

    @property
    def is_staff_waiter(self):
        return self.role in ['manager','waiter']

class SMS_Template(models.Model):
    TYPE_CHOICES = [
        ('birthday', 'پیام تولد'),
        ('promo', 'تبلیغاتی'),
        ('welcome', 'خوش‌آمدگویی'),
    ]
    title = models.CharField(max_length=100)
    text = models.TextField(help_text="از [name] برای نام کاربر استفاده کنید")
    type = models.CharField(max_length=20, choices=TYPE_CHOICES)
    cofe_owner = models.ForeignKey(to=CoffeShops , on_delete=models.CASCADE , null=True , blank=True , verbose_name='نام کافه')

    sms_api_key = models.CharField(max_length=255, blank=True, null=True, verbose_name="کلید API پیامک (sms.ir)")
    sms_line_number = models.CharField(max_length=50, blank=True, null=True, verbose_name="شماره خط پیامک اختصاصی")

    def __str__(self):
        return self.title


class Table(models.Model):
    number = models.PositiveIntegerField(unique=False, verbose_name='شماره میز')
    is_active = models.BooleanField(default=True, verbose_name='فعال/غیرفعال')

    cofe_owner = models.ForeignKey(to=CoffeShops , on_delete=models.CASCADE , null=True , blank=True , verbose_name='نام کافه')


    def __str__(self):
        return f"میز {self.number}"

class category(models.Model):
    name = models.CharField(max_length=255  , verbose_name='دسته بندی' )
    priority = models.PositiveIntegerField(default=0, verbose_name='اولویت نمایش') # برای جابجایی
    icon = models.ImageField(upload_to='category_icons/', null=True, blank=True, verbose_name='آیکون دسته')
    fa_icon = models.CharField(max_length=50, null=True, blank=True , verbose_name='آیکون آماده') # برای آیکون‌های فونت‌أوسام

    cofe_owner = models.ForeignKey(to=CoffeShops , on_delete=models.CASCADE , null=True , blank=True , verbose_name='نام کافه')
    
    is_deleted = models.BooleanField(default=False)



    class Meta:
        ordering = ['priority', 'id'] 

    def __str__(self):
        return self.name



class Food(models.Model):
    name = models.CharField(max_length=255 , verbose_name='نام')
    priority = models.PositiveIntegerField(default=0, verbose_name='اولویت در لیست')
    category = models.ForeignKey(category , on_delete=models.PROTECT  , verbose_name='دسته بندی')
    price = models.IntegerField(verbose_name='قیمت')
    cost_price = models.IntegerField(default=0, verbose_name='قیمت تمام شده (برای سود)')
    desc = models.TextField(verbose_name='توضیحات')
    img = models.ImageField(upload_to=get_file_path , verbose_name='عکس')
    is_available = models.BooleanField(default=True)
    old_price = models.PositiveIntegerField(null=True, blank=True, help_text="قیمت قبل از تخفیف")
    is_finish = models.BooleanField(default=False)
    is_deleted = models.BooleanField(default=False, verbose_name="حذف شده")

    cofe_owner = models.ForeignKey(to=CoffeShops , on_delete=models.CASCADE , null=True , blank=True , verbose_name='نام کافه')


    class Meta:
        ordering = ['priority']



    def __str__(self):
        return self.name

class Order(models.Model):
    STATUS_CHOICES = [
        ('pending', 'در انتظار تایید'),
        ('preparing', 'در حال آماده سازی'),
        ('delivered', 'تحویل شده'),
        ('paid', 'تسویه شده'),
        ('cancelled', 'لغو شده'),
    ]
    table = models.ForeignKey(Table, on_delete=models.SET_NULL, null=True, verbose_name='میز')
    total_price = models.IntegerField(default=0, verbose_name='مبلغ کل سفارش')
    status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='pending', verbose_name='وضعیت')
    created_at = models.DateTimeField(auto_now_add=True, verbose_name='تاریخ سفارش')
    device_id = models.CharField(max_length=255, blank=True, null=True, verbose_name="شناسه دستگاه (کوکی)")

    cofe_owner = models.ForeignKey(to=CoffeShops , on_delete=models.CASCADE , null=True , blank=True , verbose_name='نام کافه')

    @property
    def formatted_price(self):
        # این کد عدد را با کاما جدا می‌کند
        return f"{self.total_price:,}"



    def __str__(self):
        return f"سفارش {self.id} - میز {self.table.number}"

class OrderItem(models.Model):
    order = models.ForeignKey(Order, related_name='items', on_delete=models.CASCADE)
    food = models.ForeignKey(Food, on_delete=models.PROTECT)
    quantity = models.PositiveIntegerField(default=1)
    price_at_order = models.IntegerField() # قیمتی که آن لحظه خریده (اگر بعدا قیمت غذا تغییر کرد، آمار بهم نخورد)
    cost_price_at_order = models.IntegerField(default=0) # قیمت تمام شده در آن لحظه
    old_price_at_order = models.IntegerField(null=True, blank=True) # قیمت قبل تخفیف در آن لحظه

    cofe_owner = models.ForeignKey(to=CoffeShops , on_delete=models.CASCADE , null=True , blank=True , verbose_name='نام کافه')


    @property
    def total_item_price(self):
        return self.quantity * self.price_at_order



class Core_Settings(models.Model):
    PLAN_CHOICES = [
        (1, 'پایه (فقط منو)'),
        (2, 'برنزی (منو + سفارش‌گیری)'),
        (3, 'نقره‌ای (منو + سفارش + مالی)'),
        (4, 'طلایی (کامل + باشگاه مشتریان)'),
    ]
    
    # این فیلد را فقط "شما" در دیتابیس یا ادمین اصلی تغییر می‌دهید
    plan_level = models.IntegerField(choices=PLAN_CHOICES, default=1, verbose_name="سطح اشتراک")

    # تیک‌هایی که توسط "صاحب کافه" در داشبورد زده می‌شود
    order_enabled = models.BooleanField(default=False, verbose_name="سفارش‌گیری فعال باشد؟")
    analysis_enabled = models.BooleanField(default=False, verbose_name="سیستم مدیریت مالی فعال باشد؟")
    club_enabled = models.BooleanField(default=False, verbose_name="باشگاه مشتریان فعال باشد؟")

    THEME_CHOICES = [(f'theme-{i}', f'قالب شماره {i}') for i in range(1, 22)]
    
    title = models.CharField(max_length=255, verbose_name='عنوان وبسایت', null=True, blank=True)
    desc = models.TextField(verbose_name='توضیحات زیر عنوان وبسایت', null=True, blank=True)
    image = models.ImageField(upload_to=get_file_path_title, verbose_name='عکس هدر', null=True, blank=True)
    logo = models.ImageField(upload_to=get_file_path_logo, verbose_name='عکس لوگو', null=True, blank=True)
    theme = models.CharField(max_length=20, choices=THEME_CHOICES, default='theme-1', verbose_name='انتخاب قالب')
    auto_birthday_sms = models.BooleanField(default=False, verbose_name="ارسال خودکار پیامک تولد")
    birthday_sms_template = models.TextField(default="تولدت مبارک!", verbose_name="متن پیامک تولد")


    send_welcome_sms = models.BooleanField(default=False, verbose_name="ارسال پیام خوش آمدگویی")
    welcome_sms_template = models.TextField(blank=True, null=True, verbose_name="متن پیام خوش آمدگویی")

    cofe_owner = models.ForeignKey(to=CoffeShops , on_delete=models.CASCADE , null=True , blank=True , verbose_name='نام کافه')

    receipt_title = models.CharField(
        max_length=100, 
        default="رسید مشتری", 
        verbose_name="عنوان فیش چاپی"
    )
    enable_hafez_fal = models.BooleanField(
        default=False, 
        verbose_name="نمایش فال حافظ در انتهای فیش"
    )

    receipt_barcode_image = models.ImageField(
        upload_to='settings/', 
        blank=True, 
        null=True, 
        verbose_name="تصویر بارکد/QR کد زیر فیش",
        help_text="در صورت آپلود، جایگزین QR کد پیش‌فرض می‌شود. (اندازه پیشنهادی: 80x80 پیکسل)"
    )

    music_theme = models.CharField(
        max_length=20,
        default='theme-1',
        verbose_name="قالب تم آهنگ"
    )

    enable_creation_poems = models.BooleanField(default=False, verbose_name="فعال‌سازی شعرهای آفرینش")
    creation_poems = models.TextField(blank=True, null=True, verbose_name="متن شعرهای آفرینش")

    name_customer_fish = models.CharField(max_length=255 , null=True , blank=True , verbose_name='نام مشتری در فیش' , default='عشق')

    # def save(self, *args, **kwargs):
    #     # این بخش باعث می‌شود همیشه فقط یک آبجکت وجود داشته باشد
    #     if Core_Settings.objects.exists():
    #         return
    #     super().save(*args, **kwargs)

    def __str__(self):
        return self.cofe_owner.name
    # class Meta:
    #     verbose_name = 'تنظیمات اصلی'



class DeviceProfile(models.Model):
    device_id = models.CharField(max_length=255, unique=False, verbose_name="شناسه یکتای دستگاه")
    user = models.ForeignKey('CustomUser', on_delete=models.SET_NULL, null=True, blank=True,related_name='user', verbose_name="کاربر متصل (در صورت لاگین)")
    is_journalist = models.BooleanField(default=False, verbose_name="خبرنگار / کاربر ویژه")
    created_at = models.DateTimeField(auto_now_add=True)
    last_seen = models.DateTimeField(auto_now=True)

    cofe_owner = models.ForeignKey(to=CoffeShops , on_delete=models.CASCADE , null=True , blank=True , verbose_name='نام کافه')

    club_form_ignored_at = models.DateTimeField(
        null=True, 
        blank=True, 
        verbose_name="تاریخ آخرین انصراف از فرم باشگاه"
    )


    class Meta:
        verbose_name = "پروفایل دستگاه"
        verbose_name_plural = "پروفایل‌های دستگاه"

    def __str__(self):
        return f"Device: {self.device_id[:8]}... - Journalist: {self.is_journalist}"


class SmartRule(models.Model):
    RULE_TYPES = [
        ('discount', 'اعمال تخفیف شخصی'),
        ('recommend', 'پیشنهاد محصول جدید'),
    ]
    
    name = models.CharField(max_length=150, verbose_name="نام قانون (مثلا: تخفیف ویژه قهوه خورها)")
    rule_type = models.CharField(max_length=20, choices=RULE_TYPES, default='recommend', verbose_name="نوع قانون")
    
    # شروط قانون
    target_food = models.ForeignKey('Food', on_delete=models.CASCADE, related_name='rules_as_target', verbose_name="محصول هدف (شرط)")
    min_purchases = models.PositiveIntegerField(default=3, verbose_name="حداقل دفعات خرید برای فعال شدن")
    
    # نتیجه قانون
    suggested_food = models.ForeignKey('Food', on_delete=models.CASCADE, null=True, blank=True, related_name='rules_as_suggestion', verbose_name="محصول پیشنهادی (در صورت انتخاب نوع پیشنهاد)")
    discount_percent = models.PositiveIntegerField(default=0, verbose_name="درصد تخفیف شخصی (در صورت انتخاب نوع تخفیف)")
    
    is_active = models.BooleanField(default=True, verbose_name="فعال")


    cofe_owner = models.ForeignKey(to=CoffeShops , on_delete=models.CASCADE , null=True , blank=True , verbose_name='نام کافه')


    class Meta:
        verbose_name = "قانون پیشنهاد/تخفیف"
        verbose_name_plural = "قوانین هوشمند"

    def __str__(self):
        return self.name


from django.core.files.storage import storages

# یک تابع کوچک برای فراخوانی تنظیمات ftp
def get_ftp_storage():
    return storages['ftp_music']

class TableMusic(models.Model):
    cofe_owner = models.ForeignKey(CoffeShops, on_delete=models.CASCADE, verbose_name="کافه")
    table_number = models.CharField(max_length=10, verbose_name="شماره میز")
    title = models.CharField(max_length=255, blank=True, null=True, verbose_name="نام آهنگ")
    audio_file = models.FileField(upload_to='table_music/', null=True, blank=True, verbose_name="فایل آهنگ" , storage=get_ftp_storage)
    uploaded_at = models.DateTimeField(auto_now_add=True, verbose_name="زمان آپلود")

    order = models.IntegerField(default=0, verbose_name="ترتیب نمایش")

    class Meta:
        ordering = ['order', '-id'] # مرتب‌سازی ابتدا بر اساس order و سپس جدیدترین‌ها

    def __str__(self):
        return f"میز {self.table_number} - {self.title or 'بدون نام'}"


class ScheduledMessage(models.Model):
    TARGET_CHOICES = [
        ('all', 'همه اعضای باشگاه'),
        ('vip', 'مشتریان وفادار (VIP)'), # این خط اضافه شود
        ('single_member', 'یک عضو خاص'),
        ('custom_number', 'شماره دلخواه'),
    ]

    cafe = models.ForeignKey(CoffeShops, on_delete=models.CASCADE, related_name='scheduled_messages')
    message_text = models.TextField(verbose_name="متن پیام")
    scheduled_time = models.DateTimeField(verbose_name="تاریخ و زمان ارسال")
    is_sent = models.BooleanField(default=False, verbose_name="ارسال شده؟")
    created_at = models.DateTimeField(auto_now_add=True)

    # فیلدهای جدید برای تعیین مخاطب هدف
    target_type = models.CharField(max_length=20, choices=TARGET_CHOICES, default='all', verbose_name="نوع گیرنده")
    
    # اگر کاربر 'single_member' را انتخاب کرد، آیدی آن کاربر اینجا ذخیره می‌شود
    target_member = models.ForeignKey('CustomUser', on_delete=models.SET_NULL, null=True, blank=True, verbose_name="عضو خاص")
    
    # اگر کاربر 'custom_number' را انتخاب کرد، شماره اینجا ذخیره می‌شود
    target_custom_phone = models.CharField(max_length=15, null=True, blank=True, verbose_name="شماره دلخواه")

    def __str__(self):
        return f"پیام برای {self.scheduled_time} ({self.get_target_type_display()}) - ارسال شده: {self.is_sent}"

# In cafe/models.py

class WelcomeSMSSentLog(models.Model):
    cafe = models.ForeignKey(CoffeShops, on_delete=models.CASCADE, verbose_name="کافه")
    phone_number = models.CharField(max_length=15, verbose_name="شماره تلفن")
    sent_at = models.DateTimeField(auto_now_add=True, verbose_name="زمان ارسال")

    class Meta:
        # This ensures a phone number can only have one entry per cafe
        unique_together = ('cafe', 'phone_number')
        verbose_name = "لاگ پیام خوشامدگویی"
        verbose_name_plural = "لاگ‌های پیام خوشامدگویی"

    def __str__(self):
        return f"Welcome SMS sent to {self.phone_number} for {self.cafe.name}"


class CustomSMSTemplate(models.Model):
    """مدل جدید برای قالب‌های پیامکی دلخواه که خود کافه‌دار می‌سازد"""
    cafe = models.ForeignKey(CoffeShops, on_delete=models.CASCADE, related_name="custom_sms_templates")
    title = models.CharField(max_length=100, verbose_name="عنوان قالب")
    message_text = models.TextField(verbose_name="متن پیام")
    created_at = models.DateTimeField(auto_now_add=True)
    
    def __str__(self):
        return self.title

class SMSHistory(models.Model):
    """مدل جدید برای ذخیره تاریخچه پیامک‌های ارسال شده از داشبورد"""
    cafe = models.ForeignKey(CoffeShops, on_delete=models.CASCADE, related_name="sms_histories")
    message_text = models.TextField(verbose_name="متن پیامک")
    target_group_display = models.CharField(max_length=100, verbose_name="گروه هدف (نمایشی)")
    recipients_count = models.IntegerField(default=0, verbose_name="تعداد گیرندگان")
    status = models.CharField(max_length=50, verbose_name="وضعیت (موفق/ناموفق)")
    sent_at = models.DateTimeField(auto_now_add=True, verbose_name="زمان ارسال")
    
    def __str__(self):
        return f"ارسال به {self.target_group_display} ({self.recipients_count} نفر)"
