# app/models/commission.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 SystemCommission(db.Model):
    """مدل کمیسیون سیستم و مدیران"""
    __tablename__ = 'system_commissions'
    __table_args__ = {'extend_existing': True}
    
    id = db.Column(db.Integer, primary_key=True)
    
    # اطلاعات قرارداد
    contract_id = db.Column(db.Integer, db.ForeignKey('contracts.id'), nullable=False)
    project_id = db.Column(db.Integer, db.ForeignKey('projects.id'), nullable=False)
    deposit_id = db.Column(db.Integer, db.ForeignKey('deposits.id'), nullable=False)
    
    # مبالغ
    total_amount = db.Column(db.Float, nullable=False)  # مبلغ کل واریزی
    system_commission_percent = db.Column(db.Float, default=10)  # 10 درصد سهم سیستم
    system_commission_amount = db.Column(db.Float, nullable=False)
    manager_commission_percent = db.Column(db.Float, default=5)  # 5 درصد سهم مدیر پروژه
    manager_commission_amount = db.Column(db.Float, nullable=False)
    
    # مدیر پروژه
    manager_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
    
    # چک‌های صادر شده
    system_check_id = db.Column(db.Integer, db.ForeignKey('electronic_checks.id'), nullable=True)
    manager_check_id = db.Column(db.Integer, db.ForeignKey('electronic_checks.id'), nullable=True)
    
    # وضعیت
    status = db.Column(db.String(20), default='pending')  # pending, paid, cancelled
    
    # زمان‌ها
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    paid_at = db.Column(db.DateTime, nullable=True)
    cancelled_at = db.Column(db.DateTime, nullable=True)
    
    # توضیحات
    description = db.Column(db.Text, nullable=True)
    cancellation_reason = db.Column(db.Text, nullable=True)
    
    # ========== روابط با نام‌های یکتا ==========

    # رابطه با Contract
    contract = db.relationship(
        'Contract',
        foreign_keys=[contract_id],
        back_populates='commission_items'  # نام یکتا
    )
    
    # رابطه با Project
    project = db.relationship(
        'Project',
        foreign_keys=[project_id],
        backref='project_commission_records'  # نام یکتا
    )
    
    # رابطه با Deposit
    deposit = db.relationship(
        'Deposit',
        foreign_keys=[deposit_id],
        backref='deposit_commission_records'  # نام یکتا
    )
    
    # رابطه با Manager (User)
    manager = db.relationship(
        'User',
        foreign_keys=[manager_id],
        backref='manager_commission_records'  # نام یکتا
    )
    
    # رابطه با System Check (ElectronicCheck)
    system_check = db.relationship(
        'ElectronicCheck',
        foreign_keys=[system_check_id],
        backref='system_commission_record'  # نام یکتا
    )
    
    # رابطه با Manager Check (ElectronicCheck)
    manager_check = db.relationship(
        'ElectronicCheck',
        foreign_keys=[manager_check_id],
        backref='manager_commission_record'  # نام یکتا
    )
    
    # ========== متدها ==========
    
    @classmethod
    def calculate_commissions(cls, contract_id, project_id, deposit_id, amount, manager_id):
        """محاسبه کمیسیون‌ها"""
        system_percent = 10
        manager_percent = 5
        
        system_amount = amount * (system_percent / 100)
        manager_amount = amount * (manager_percent / 100)
        
        commission = cls(
            contract_id=contract_id,
            project_id=project_id,
            deposit_id=deposit_id,
            total_amount=amount,
            system_commission_percent=system_percent,
            system_commission_amount=system_amount,
            manager_commission_percent=manager_percent,
            manager_commission_amount=manager_amount,
            manager_id=manager_id,
            status='pending'
        )
        return commission
    
    def mark_as_paid(self, system_check_id=None, manager_check_id=None):
        """علامت زدن کمیسیون به عنوان پرداخت شده"""
        self.status = 'paid'
        self.paid_at = datetime.utcnow()
        if system_check_id:
            self.system_check_id = system_check_id
        if manager_check_id:
            self.manager_check_id = manager_check_id
    
    def cancel(self, reason=None):
        """لغو کمیسیون"""
        self.status = 'cancelled'
        self.cancelled_at = datetime.utcnow()
        if reason:
            self.cancellation_reason = reason
    
    def get_system_commission_formatted(self):
        """دریافت کمیسیون سیستم به صورت فرمت شده"""
        return f"{self.system_commission_amount:,.0f}"
    
    def get_manager_commission_formatted(self):
        """دریافت کمیسیون مدیر به صورت فرمت شده"""
        return f"{self.manager_commission_amount:,.0f}"
    
    def get_total_amount_formatted(self):
        """دریافت مبلغ کل به صورت فرمت شده"""
        return f"{self.total_amount:,.0f}"
    
    def get_status_display(self):
        """نمایش وضعیت به فارسی"""
        status_map = {
            'pending': 'در انتظار پرداخت',
            'paid': 'پرداخت شده',
            'cancelled': 'لغو شده'
        }
        return status_map.get(self.status, self.status)
    
    def to_dict(self):
        """تبدیل به دیکشنری برای JSON"""
        return {
            'id': self.id,
            'contract_id': self.contract_id,
            'project_id': self.project_id,
            'project_name': self.project.name if self.project else None,
            'deposit_id': self.deposit_id,
            'total_amount': self.total_amount,
            'total_amount_formatted': self.get_total_amount_formatted(),
            'system_commission_percent': self.system_commission_percent,
            'system_commission_amount': self.system_commission_amount,
            'system_commission_formatted': self.get_system_commission_formatted(),
            'manager_commission_percent': self.manager_commission_percent,
            'manager_commission_amount': self.manager_commission_amount,
            'manager_commission_formatted': self.get_manager_commission_formatted(),
            'manager_id': self.manager_id,
            'manager_name': self.manager.fullname if self.manager else None,
            'system_check_id': self.system_check_id,
            'system_check_number': self.system_check.check_number if self.system_check else None,
            'manager_check_id': self.manager_check_id,
            'manager_check_number': self.manager_check.check_number if self.manager_check else None,
            'status': self.status,
            'status_display': self.get_status_display(),
            'description': self.description,
            'created_at': self.created_at.strftime('%Y-%m-%d %H:%M:%S'),
            'paid_at': self.paid_at.strftime('%Y-%m-%d %H:%M:%S') if self.paid_at else None
        }
    
    def __repr__(self):
        return f'<SystemCommission {self.id} - System:{self.system_commission_amount} - Manager:{self.manager_commission_amount}>'