import os
import json
from datetime import datetime, timedelta
import aiosqlite
from aiogram import Bot
from aiogram.types import InputRichMessage, InlineKeyboardMarkup, InlineKeyboardButton
from config import DB_PATH
from utils.date_utils import to_shamsi
from utils.logger import get_logger

logger = get_logger(__name__)

# File path to store sent reminder IDs
REMINDERS_FILE = os.path.join(os.path.dirname(os.path.dirname(__file__)), "scratch", "sent_reminders.json")

async def check_deadlines(bot: Bot):
    logger.info("Checking milestones deadlines for alerts...")
    
    # Ensure directory exists
    os.makedirs(os.path.dirname(REMINDERS_FILE), exist_ok=True)
    
    # Load already sent reminders
    sent_reminders = {}
    if os.path.exists(REMINDERS_FILE):
        try:
            with open(REMINDERS_FILE, 'r', encoding='utf-8') as f:
                data = json.load(f)
                if isinstance(data, dict):
                    sent_reminders = data
                elif isinstance(data, list):
                    # Migration from list format: treat them as if 24h reminders were sent
                    sent_reminders = {str(item): ["24h"] for item in data}
        except Exception as e:
            logger.error(f"Error loading sent reminders file: {e}")
            
    try:
        async with aiosqlite.connect(DB_PATH) as db:
            db.row_factory = aiosqlite.Row
            
            # Query active milestones for in_progress projects
            query = """
                SELECT 
                    m.milestone_id,
                    m.title as milestone_title,
                    m.amount as milestone_amount,
                    p.project_id, 
                    p.title as project_title, 
                    p.client_id, 
                    p.chosen_freelancer_id,
                    e.created_at as project_start_time,
                    b.delivery_days
                FROM milestones m
                JOIN projects p ON m.project_id = p.project_id
                JOIN escrow e ON p.project_id = e.project_id
                JOIN bids b ON p.project_id = b.project_id AND b.status = 'accepted'
                WHERE p.status = 'in_progress' AND m.status = 'held'
            """
            
            async with db.execute(query) as cursor:
                rows = await cursor.fetchall()
                
            now = datetime.utcnow()
            new_sends = False
            
            for row in rows:
                milestone_id = row['milestone_id']
                m_id_str = str(milestone_id)
                stages_sent = sent_reminders.get(m_id_str, [])
                
                # Parse start time
                start_time_str = row['project_start_time']
                try:
                    # SQLite CURRENT_TIMESTAMP format is 'YYYY-MM-DD HH:MM:SS'
                    # Strip any fractional seconds or trailing Z if present
                    clean_time = start_time_str.replace('T', ' ').split('.')[0]
                    start_dt = datetime.strptime(clean_time, '%Y-%m-%d %H:%M:%S')
                except Exception as e:
                    logger.error(f"Failed to parse project_start_time '{start_time_str}' for project {row['project_id']}: {e}")
                    continue
                    
                delivery_days = row['delivery_days'] or 1
                deadline_dt = start_dt + timedelta(days=delivery_days)
                
                time_remaining = deadline_dt - now
                seconds_remaining = time_remaining.total_seconds()
                
                # Determine stage
                stage = None
                freelancer_html = None
                client_html = None
                
                if seconds_remaining <= 0:
                    stage = "overdue"
                elif seconds_remaining <= 86400:  # 24 hours
                    stage = "24h"
                elif seconds_remaining <= 172800: # 48 hours
                    stage = "48h"
                    
                if stage and stage not in stages_sent:
                    # Check if subsequent stages are already sent (in case worker was down)
                    if stage == "48h" and ("24h" in stages_sent or "overdue" in stages_sent):
                        continue
                    if stage == "24h" and "overdue" in stages_sent:
                        continue
                        
                    deadline_shamsi = to_shamsi(deadline_dt)
                    project_title = row['project_title']
                    milestone_title = row['milestone_title']
                    milestone_amount = row['milestone_amount']
                    freelancer_id = row['chosen_freelancer_id']
                    client_id = row['client_id']
                    project_id = row['project_id']
                    
                    if stage == "48h":
                        freelancer_html = (
                            "<h1>⏳ یادآوری: ۴۸ ساعت تا پایان مهلت فاز پروژه</h1>"
                            "<hr/>"
                            "<p>فریلنسر گرامی، حدود <b>۴۸ ساعت</b> تا پایان مهلت تحویل فاز پرداخت امن زیر باقی مانده است:</p>"
                            "<br/>"
                            "<table bordered striped>"
                            f"  <tr><th>📌 عنوان پروژه</th><td><b>{project_title}</b></td></tr>"
                            f"  <tr><th>💰 فاز پرداخت امن</th><td>{milestone_title} ({milestone_amount:,} تومان)</td></tr>"
                            f"  <tr><th>⏰ مهلت تحویل</th><td><b>{deadline_shamsi}</b></td></tr>"
                            "</table>"
                            "<br/>"
                            "<blockquote>💡 لطفاً روند انجام کار را با کارفرما هماهنگ کرده و پیش‌نویس خروجی‌ها را آماده کنید.</blockquote>"
                        )
                        client_html = (
                            "<h1>🔔 یادآوری: ۴۸ ساعت تا پایان مهلت فاز پروژه</h1>"
                            "<hr/>"
                            "<p>کارفرمای گرامی، حدود <b>۴۸ ساعت</b> تا پایان مهلت تحویل فاز پرداخت امن زیر باقی مانده است:</p>"
                            "<br/>"
                            "<table bordered striped>"
                            f"  <tr><th>📌 عنوان پروژه</th><td><b>{project_title}</b></td></tr>"
                            f"  <tr><th>💰 فاز پرداخت امن</th><td>{milestone_title} ({milestone_amount:,} تومان)</td></tr>"
                            f"  <tr><th>⏰ مهلت تحویل</th><td><b>{deadline_shamsi}</b></td></tr>"
                            "</table>"
                            "<br/>"
                            "<blockquote>💡 می‌توانید جهت بررسی روند پیشرفت کار، از طریق بخش گفتگوی ربات با فریلنسر ارتباط برقرار کنید.</blockquote>"
                        )
                    elif stage == "24h":
                        freelancer_html = (
                            "<h1>⚠️ هشدار جدی: کمتر از ۲۴ ساعت تا پایان مهلت!</h1>"
                            "<hr/>"
                            "<p>فریلنسر گرامی، کمتر از <b>۲۴ ساعت</b> به پایان مهلت فاز پرداخت امن زیر باقی مانده است:</p>"
                            "<br/>"
                            "<table bordered striped>"
                            f"  <tr><th>📌 عنوان پروژه</th><td><b>{project_title}</b></td></tr>"
                            f"  <tr><th>💰 فاز پرداخت امن</th><td>{milestone_title} ({milestone_amount:,} تومان)</td></tr>"
                            f"  <tr><th>⏰ مهلت تحویل</th><td><b>{deadline_shamsi}</b></td></tr>"
                            "</table>"
                            "<br/>"
                            "<blockquote>💡 توجه داشته باشید که عدم تحویل به موقع ممکن است منجر به ثبت شکایت از طرف کارفرما و تاثیر منفی بر روی نرخ تحویل به موقع پروفایل شما شود.</blockquote>"
                        )
                        client_html = (
                            "<h1>⚠️ هشدار: کمتر از ۲۴ ساعت تا پایان مهلت فاز پروژه</h1>"
                            "<hr/>"
                            "<p>کارفرمای گرامی، کمتر از <b>۲۴ ساعت</b> به پایان مهلت فاز پرداخت امن زیر باقی مانده است:</p>"
                            "<br/>"
                            "<table bordered striped>"
                            f"  <tr><th>📌 عنوان پروژه</th><td><b>{project_title}</b></td></tr>"
                            f"  <tr><th>💰 فاز پرداخت امن</th><td>{milestone_title} ({milestone_amount:,} تومان)</td></tr>"
                            f"  <tr><th>⏰ مهلت تحویل</th><td><b>{deadline_shamsi}</b></td></tr>"
                            "</table>"
                            "<br/>"
                            "<blockquote>💡 در صورت عدم تحویل به موقع توسط فریلنسر، می‌توانید وضعیت پروژه را پیگیری کرده یا با او گفتگو کنید.</blockquote>"
                        )
                    elif stage == "overdue":
                        freelancer_html = (
                            "<h1>🚨 هشدار: مهلت فاز پروژه به پایان رسیده و منقضی شده است!</h1>"
                            "<hr/>"
                            "<p>فریلنسر گرامی، مهلت قانونی تحویل فاز پرداخت امن زیر به پایان رسیده است و پروژه در وضعیت <b>تأخیر (Overdue)</b> قرار دارد:</p>"
                            "<br/>"
                            "<table bordered striped>"
                            f"  <tr><th>📌 عنوان پروژه</th><td><b>{project_title}</b></td></tr>"
                            f"  <tr><th>💰 فاز پرداخت امن</th><td>{milestone_title} ({milestone_amount:,} تومان)</td></tr>"
                            f"  <tr><th>⏰ مهلت قبلی</th><td><b>{deadline_shamsi}</b></td></tr>"
                            "</table>"
                            "<br/>"
                            "<blockquote>🚨 توجه: هرچه سریع‌تر کار را تحویل دهید یا از کارفرما درخواست تمدید مهلت پروژه کنید تا از جریمه و داوری جلوگیری شود.</blockquote>"
                        )
                        client_html = (
                            "<h1>🚨 هشدار: مهلت تحویل فاز پروژه به پایان رسیده است!</h1>"
                            "<hr/>"
                            "<p>کارفرمای گرامی، مهلت تحویل فاز پرداخت امن زیر به پایان رسیده و فریلنسر در تحویل کار <b>تاخیر</b> داشته است:</p>"
                            "<br/>"
                            "<table bordered striped>"
                            f"  <tr><th>📌 عنوان پروژه</th><td><b>{project_title}</b></td></tr>"
                            f"  <tr><th>💰 فاز پرداخت امن</th><td>{milestone_title} ({milestone_amount:,} تومان)</td></tr>"
                            f"  <tr><th>⏰ مهلت قبلی</th><td><b>{deadline_shamsi}</b></td></tr>"
                            "</table>"
                            "<br/>"
                            "<blockquote>💡 شما می‌توانید از دکمه زیر وارد بخش مدیریت پروژه شده و در صورت لزوم درخواست داوری (لغو پروژه) ثبت کنید یا با فریلنسر جهت تمدید مهلت هماهنگ شوید.</blockquote>"
                        )

                    # Build markups
                    try:
                        from keyboards import inline
                        freelancer_markup = inline.freelancer_accepted_project_keyboard(project_id, 'in_progress')
                    except Exception as e:
                        logger.error(f"Failed to load freelancer keyboard: {e}")
                        freelancer_markup = None

                    client_markup = InlineKeyboardMarkup(inline_keyboard=[
                        [InlineKeyboardButton(text="📑 مدیریت پروژه", callback_data=f"client_project_{project_id}")]
                    ])
                    
                    # Send to Freelancer
                    try:
                        await bot.send_rich_message(
                            chat_id=freelancer_id,
                            rich_message=InputRichMessage(html=freelancer_html),
                            reply_markup=freelancer_markup
                        )
                        logger.info(f"Sent {stage} deadline alert to freelancer {freelancer_id} for milestone {milestone_id}")
                    except Exception as e:
                        logger.error(f"Failed to send {stage} deadline alert to freelancer {freelancer_id}: {e}")
                        
                    # Send to Client
                    try:
                        await bot.send_rich_message(
                            chat_id=client_id,
                            rich_message=InputRichMessage(html=client_html),
                            reply_markup=client_markup
                        )
                        logger.info(f"Sent {stage} deadline alert to client {client_id} for milestone {milestone_id}")
                    except Exception as e:
                        logger.error(f"Failed to send {stage} deadline alert to client {client_id}: {e}")
                        
                    # Mark as sent
                    stages_sent.append(stage)
                    sent_reminders[m_id_str] = stages_sent
                    new_sends = True
                    
            if new_sends:
                with open(REMINDERS_FILE, 'w', encoding='utf-8') as f:
                    json.dump(sent_reminders, f, indent=4)
                    
    except Exception as e:
        logger.error(f"Error in check_deadlines query/execution: {e}")
