# app/models/notification.py

from flask_login import UserMixin
from datetime import datetime
from app.extensions import db, login_manager
from werkzeug.security import generate_password_hash, check_password_hash
import random
import string
import json


class Notification(db.Model):
    """مدل اطلاع‌رسانی‌های سیستم"""
    __tablename__ = 'notifications'
    __table_args__ = {'extend_existing': True}
    
    id = db.Column(db.Integer, primary_key=True)
    
    # گیرنده
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
    
    # محتوا
    title = db.Column(db.String(200), nullable=False)
    message = db.Column(db.Text, nullable=False)
    type = db.Column(db.String(50), default='info')  # info, success, warning, danger, primary
    
    # وضعیت
    is_read = db.Column(db.Boolean, default=False)
    read_at = db.Column(db.DateTime, nullable=True)
    
    # لینک
    link = db.Column(db.String(300), nullable=True)
    
    # اطلاعات اضافی (JSON)
    data = db.Column(db.JSON, nullable=True)  # اطلاعات اضافی مثل entity_id, entity_type
    
    # زمان‌ها
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
    
    # ========== روابط با نام‌های یکتا ==========
    
    # رابطه با User
    user = db.relationship(
        'User',
        foreign_keys=[user_id],
        backref='user_notifications_list'  # نام یکتا
    )
    
    # ========== متدها ==========
    
    @classmethod
    def create(cls, user_id, title, message, type='info', link=None, data=None):
        """ایجاد نوتیفیکیشن جدید"""
        notification = cls(
            user_id=user_id,
            title=title,
            message=message,
            type=type,
            link=link,
            data=data
        )
        db.session.add(notification)
        db.session.commit()
        return notification
    
    @classmethod
    def create_for_users(cls, user_ids, title, message, type='info', link=None, data=None):
        """ایجاد نوتیفیکیشن برای چند کاربر"""
        notifications = []
        for user_id in user_ids:
            notification = cls(
                user_id=user_id,
                title=title,
                message=message,
                type=type,
                link=link,
                data=data
            )
            notifications.append(notification)
        
        db.session.add_all(notifications)
        db.session.commit()
        return notifications
    
    @classmethod
    def create_for_role(cls, role, title, message, type='info', link=None, data=None):
        """ایجاد نوتیفیکیشن برای همه کاربران با نقش مشخص"""
        from app.models import User
        users = User.query.filter_by(role=role).all()
        user_ids = [user.id for user in users]
        return cls.create_for_users(user_ids, title, message, type, link, data)
    
    @classmethod
    def create_for_all(cls, title, message, type='info', link=None, data=None):
        """ایجاد نوتیفیکیشن برای همه کاربران"""
        from app.models import User
        users = User.query.all()
        user_ids = [user.id for user in users]
        return cls.create_for_users(user_ids, title, message, type, link, data)
    
    def mark_as_read(self):
        """علامت زدن به عنوان خوانده شده"""
        if not self.is_read:
            self.is_read = True
            self.read_at = datetime.utcnow()
            db.session.commit()
    
    def mark_as_unread(self):
        """علامت زدن به عنوان خوانده نشده"""
        if self.is_read:
            self.is_read = False
            self.read_at = None
            db.session.commit()
    
    def get_type_icon(self):
        """دریافت آیکون بر اساس نوع"""
        icon_map = {
            'info': 'fa-info-circle',
            'success': 'fa-check-circle',
            'warning': 'fa-exclamation-triangle',
            'danger': 'fa-times-circle',
            'primary': 'fa-star'
        }
        return icon_map.get(self.type, 'fa-bell')
    
    def get_type_color(self):
        """دریافت رنگ بر اساس نوع"""
        color_map = {
            'info': 'info',
            'success': 'success',
            'warning': 'warning',
            'danger': 'danger',
            'primary': 'primary'
        }
        return color_map.get(self.type, 'secondary')
    
    def to_dict(self):
        """تبدیل به دیکشنری برای JSON"""
        return {
            'id': self.id,
            'user_id': self.user_id,
            'title': self.title,
            'message': self.message,
            'type': self.type,
            'type_icon': self.get_type_icon(),
            'type_color': self.get_type_color(),
            'is_read': self.is_read,
            'read_at': self.read_at.strftime('%Y-%m-%d %H:%M:%S') if self.read_at else None,
            'link': self.link,
            'data': self.data,
            'created_at': self.created_at.strftime('%Y-%m-%d %H:%M:%S'),
            'time_ago': self.get_time_ago()
        }
    
    def get_time_ago(self):
        """دریافت زمان گذشته به صورت خوانا"""
        from datetime import timedelta
        now = datetime.utcnow()
        diff = now - self.created_at
        
        if diff.days > 30:
            return f"{diff.days // 30} ماه پیش"
        elif diff.days > 0:
            return f"{diff.days} روز پیش"
        elif diff.seconds > 3600:
            return f"{diff.seconds // 3600} ساعت پیش"
        elif diff.seconds > 60:
            return f"{diff.seconds // 60} دقیقه پیش"
        else:
            return "چند لحظه پیش"
    
    def __repr__(self):
        return f'<Notification {self.id} - {self.title} - {self.type}>'


# ============================================
# مدل تنظیمات نوتیفیکیشن (NotificationSetting)
# ============================================

class NotificationSetting(db.Model):
    """مدل تنظیمات نوتیفیکیشن برای هر کاربر"""
    __tablename__ = 'notification_settings'
    __table_args__ = {'extend_existing': True}
    
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'), unique=True, nullable=False)
    
    # تنظیمات انواع نوتیفیکیشن
    email_enabled = db.Column(db.Boolean, default=True)
    sms_enabled = db.Column(db.Boolean, default=False)
    push_enabled = db.Column(db.Boolean, default=True)
    
    # تنظیمات برای هر نوع رویداد
    events = db.Column(db.JSON, default={
        'payment_request': True,
        'payment_approved': True,
        'payment_rejected': True,
        'contract_created': True,
        'attendance_recorded': True,
        'project_updated': True,
        'system_alert': True
    })
    
    # زمان‌ها
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
    
    # ========== روابط با نام‌های یکتا ==========
    
    # رابطه با User
    user = db.relationship(
        'User',
        foreign_keys=[user_id],
        backref='notification_settings_ref'  # نام یکتا
    )
    
    def __repr__(self):
        return f'<NotificationSetting {self.user_id}>'