# app/models/advertisement.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


class Advertisement(db.Model):
    """مدل تبلیغات (نسخه ساده)"""
    __tablename__ = 'advertisements'
    __table_args__ = {'extend_existing': True}
    
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100), nullable=False)
    description = db.Column(db.Text, nullable=False)
    image_path = db.Column(db.String(200), nullable=True)
    is_approved = db.Column(db.Boolean, default=False)
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=True)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    
    # روابط - با نام یکتا
    user = db.relationship('User', foreign_keys=[user_id], backref='user_advertisements')
    
    def __repr__(self):
        return f'<Advertisement {self.title}>'

class AdvertisementRequest(db.Model):
    """مدل درخواست تبلیغات"""
    __tablename__ = 'advertisement_requests'
    __table_args__ = {'extend_existing': True}
    
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(200), nullable=False)
    description = db.Column(db.Text, nullable=False)
    image_path = db.Column(db.String(500), nullable=True)
    target_url = db.Column(db.String(500), nullable=True)
    duration_days = db.Column(db.Integer, default=30)
    price = db.Column(db.Float, default=0)
    advertiser_name = db.Column(db.String(100), nullable=True)
    advertiser_phone = db.Column(db.String(20), nullable=True)
    advertiser_email = db.Column(db.String(100), nullable=True)
    
    # ✅ اضافه کردن فیلد user_id (اختیاری)
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=True)
    
    status = db.Column(db.String(20), default='pending')  # pending, approved, rejected
    admin_note = db.Column(db.Text, nullable=True)
    approved_by = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=True)
    approved_at = db.Column(db.DateTime, nullable=True)
    start_date = db.Column(db.DateTime, nullable=True)
    end_date = db.Column(db.DateTime, nullable=True)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    view_count = db.Column(db.Integer, default=0)
    click_count = db.Column(db.Integer, default=0)
    
    # روابط
    user = db.relationship('User', foreign_keys=[user_id], backref='advertisement_requests')
    approver = db.relationship('User', foreign_keys=[approved_by], backref='approved_advertisements')
    

    @property
    def is_approved(self):
        """بررسی تایید بودن (سازگاری با کدهای قدیمی)"""
        return self.status == 'approved'
    
    @is_approved.setter
    def is_approved(self, value):
        """تنظیم وضعیت تایید (سازگاری با کدهای قدیمی)"""
        self.status = 'approved' if value else 'rejected'
    
    def approve(self, admin_id):
        """تایید تبلیغ توسط ادمین"""
        self.status = 'approved'
        self.approved_by = admin_id
        self.approved_at = datetime.utcnow()
        self.start_date = datetime.utcnow()
        self.end_date = datetime.utcnow() + timedelta(days=self.duration_days)
    
    def reject(self, admin_id, note=None):
        """رد تبلیغ توسط ادمین"""
        self.status = 'rejected'
        self.approved_by = admin_id
        self.approved_at = datetime.utcnow()
        if note:
            self.admin_note = note
    
    def increment_view(self):
        """افزایش تعداد بازدید"""
        self.view_count += 1
    
    def increment_click(self):
        """افزایش تعداد کلیک"""
        self.click_count += 1
    
    def __repr__(self):
        return f'<AdvertisementRequest {self.title} - {self.status}>'