import os
import json
import gspread
import schedule
import time
import subprocess  # برای اجرای اسکریپت buy.py
import logging
from google.oauth2.service_account import Credentials

# پیکربندی logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(message)s')

# مسیر فایل JSON کلید سرویس
SERVICE_ACCOUNT_FILE = 'convertor-442908-971da106cfc0.json'

# دامنه دسترسی به API
SCOPES = ['https://www.googleapis.com/auth/spreadsheets']

# احراز هویت
credentials = Credentials.from_service_account_file(
    SERVICE_ACCOUNT_FILE, scopes=SCOPES
)

# اتصال به Google Sheets
gc = gspread.authorize(credentials)

# لینک شیت گوگل
spreadsheet_url = "https://docs.google.com/spreadsheets/d/1FFSeukdkJ81m7BBtC3zLHBoiyqFhxuQSKGByUOlmbBU/edit?resourcekey=&gid=27820938#gid=27820938"

# مسیر فایل‌ها
inventory_buy_file = os.path.join(os.getcwd(), "inventory_buy.json")
inventory_sell_file = os.path.join(os.getcwd(), "inventory_sell.json")
inventory_data_file = os.path.join(os.getcwd(), "inventory_data.json")
output_txt_file = os.path.join(os.getcwd(), "inventory_info.txt")

# تابع برای اجرای buy.py
def run_buy_script():
    logging.info("در حال اجرای buy.py برای به‌روزرسانی فایل خرید خودرو...")
    try:
        subprocess.run(['python3', 'buy.py'], check=True)
        logging.info("اجرای buy.py با موفقیت انجام شد.")
    except subprocess.CalledProcessError as e:
        logging.error(f"خطا در اجرای buy.py: {e}")

# تابع مربوط به خرید خودرو (خواندن از inventory_buy.json)
def get_buy_data():
    if os.path.exists(inventory_buy_file):
        with open(inventory_buy_file, 'r', encoding='utf-8') as file:
            buy_data = json.load(file)
        return buy_data
    else:
        return []

# تابع مربوط به فروش خودرو (خواندن از inventory_sell.json)
def get_sell_data():
    if os.path.exists(inventory_sell_file):
        with open(inventory_sell_file, 'r', encoding='utf-8') as file:
            sell_data = json.load(file)
        return sell_data
    else:
        return []

# تابع نمایش داده‌های خرید خودرو
def display_buy_data():
    buy_data = get_buy_data()
    if buy_data:
        logging.info("📋 لیست خرید خودروها:")
        for car in buy_data:
            logging.info(f"🚗 نام خودرو: {car['نام خودرو']}")
            logging.info(f"🎨 مدل: {car['مدل']}")
            logging.info(f"💰 قیمت: {car['قیمت']} تومان")
            logging.info('--------------------')
    else:
        logging.info("هیچ داده‌ای در فایل خرید خودرو موجود نیست.")

# تابع نمایش داده‌های فروش خودرو
def display_sell_data():
    sell_data = get_sell_data()
    if sell_data:
        logging.info("📋 لیست فروش خودروها:")
        for car in sell_data:
            logging.info(f"🚗 نام خودرو: {car['نام خودرو']}")
            logging.info(f"🎨 مدل: {car['مدل']}")
            logging.info(f"💰 قیمت: {car['قیمت']} تومان")
            logging.info('--------------------')
    else:
        logging.info("هیچ داده‌ای در فایل فروش خودرو موجود نیست.")

# تابع اصلی که داده‌ها را از شیت می‌خواند و ذخیره می‌کند
def fetch_and_save_data():
    # اجرای buy.py هر بار
    run_buy_script()

    # باز کردن شیت
    spreadsheet = gc.open_by_url(spreadsheet_url)
    sheet = spreadsheet.sheet1

    # دریافت داده‌ها از شیت
    headers = sheet.row_values(1)  # هدرها از ردیف اول
    data = sheet.get_all_values()[1:]  # داده‌ها از ردیف دوم به بعد

    # فیلتر کردن سطرهای خالی
    filtered_data = [row for row in data if any(cell.strip() for cell in row)]

    # ستون‌های موردنظر بر اساس ساختار جدید
    timestamp_index = 0  # ستون A
    expert_index = 1
    car_name_index = 2
    model_index = 3
    color_index = 4
    usage_index = 5
    price_index = 6
    description_index = 7

    # ذخیره اطلاعات به صورت ساختاردهی‌شده
    experts = {}

    for row in filtered_data:
        timestamp_str = row[timestamp_index].strip()  # محتوای ستون A بدون تغییر
        expert_name = row[expert_index]
        car_data = {
            "شناسه/تاریخ": timestamp_str,  # افزودن محتوای ستون A به‌صورت رشته
            "نام خودرو": row[car_name_index],
            "مدل": row[model_index],
            "رنگ": row[color_index],
            "کارکرد": row[usage_index],
            "قیمت": row[price_index],
            "توضیحات": row[description_index]
        }
        # اضافه کردن خودروها به کارشناس
        if expert_name not in experts:
            experts[expert_name] = {"نام کارشناس": expert_name, "خودروها": []}
        experts[expert_name]["خودروها"].append(car_data)

    # تبدیل داده‌های کارشناسان به لیست
    structured_data = list(experts.values())

    # ذخیره داده‌ها در فایل
    save_json_data(inventory_data_file, structured_data)

    # نمایش داده‌های خرید و فروش خودرو
    display_buy_data()
    display_sell_data()

    # ایجاد یا به‌روزرسانی فایل TXT
    fixed_text = "📢📢 فروش فوری خودرو 🚗📢📢\n\n"
    outro_text = "🌟 جهت دریافت اطلاعات بیشتر با ما در تماس باشید 🌟\n📞 09371408833\n🌐 دپارتمان خودرویی دیانت دار 🌐"

    with open(output_txt_file, "w", encoding="utf-8") as txt_file:
        txt_file.write(fixed_text)
        for expert in structured_data:
            for car in expert["خودروها"]:
                txt_file.write(f"🚗 نام خودرو: {car['نام خودرو']}\n")
                txt_file.write(f"🎨 مدل: {car['مدل']}\n")
                txt_file.write(f"🌈 رنگ: {car['رنگ']}\n")
                txt_file.write(f"📏 کارکرد: {car['کارکرد']} کیلومتر\n")
                txt_file.write(f"💰 قیمت: {car['قیمت']} تومان\n")
                txt_file.write(f"📝 توضیحات: {car['توضیحات']}\n\n")
        txt_file.write(outro_text)

    logging.info(f"اطلاعات در فایل‌های زیر ذخیره شدند:\n1. JSON: '{inventory_data_file}'\n2. TXT: '{output_txt_file}'")

# تابع ذخیره‌سازی داده‌ها
def save_json_data(file_path, data):
    with open(file_path, "w", encoding="utf-8") as file:
        json.dump(data, file, ensure_ascii=False, indent=4)

# تنظیم زمان‌بندی برای اجرای هر 1 دقیقه یک بار
schedule.every(1).minutes.do(fetch_and_save_data)

# اجرای بی‌پایان برنامه برای بررسی زمان‌بندی و اجرا
while True:
    schedule.run_pending()
    time.sleep(60)  # چک کردن زمان‌بندی هر 60 ثانیه یک بار
