import sys
import asyncio
import os
import csv
import json
import subprocess
from datetime import datetime

SCRIPTS_DIR = os.path.dirname(os.path.abspath(__file__))
ROOT_DIR = os.path.dirname(SCRIPTS_DIR)

if ROOT_DIR not in sys.path:
    sys.path.insert(0, ROOT_DIR)


def get_config():
    config_path = os.path.join(ROOT_DIR, 'config.json')
    with open(config_path, 'r') as f:
        return json.load(f)



def run_deploy(auto=False):
    if auto:
        pass
    else:
        print("=" * 40)
        print("   Create & Upload to GCS")
        print("=" * 40)
        print()

        confirm = input("Proceed with deployment? [Y/n]: ").strip().lower()
        if confirm == 'n':
            print("Deployment cancelled.")
            return

        print()
        print("Starting deployment...")
        print()

    deploy_path = os.path.join(SCRIPTS_DIR, 'deploy.py')
    result = subprocess.run(
        [sys.executable, deploy_path],
        cwd=ROOT_DIR
    )

    if result.returncode != 0:
        print(f"Deployment failed with exit code {result.returncode}")


def run_submit(auto=False):
    if auto:
        pass
    else:
        print("=" * 40)
        print("   Submit to IndexNow")
        print("=" * 40)
        print()

        confirm = input("Proceed with submission? [Y/n]: ").strip().lower()
        if confirm == 'n':
            print("Submission cancelled.")
            return

        print()
        print("Starting submission...")
        print()

    submit_path = os.path.join(SCRIPTS_DIR, 'submit_now.py')
    result = subprocess.run(
        [sys.executable, submit_path],
        cwd=ROOT_DIR
    )

    if result.returncode != 0:
        print(f"Submission failed with exit code {result.returncode}")


def print_summary():
    report_folder = os.path.join(ROOT_DIR, 'report')
    deploy_json = os.path.join(report_folder, 'deploy-summary.json')
    submit_json = os.path.join(report_folder, 'submit-summary.json')

    deploy_data = {}
    if os.path.exists(deploy_json):
        with open(deploy_json, 'r', encoding='utf-8') as f:
            for item in json.load(f):
                deploy_data[item['bucket']] = item

    submit_data = {}
    if os.path.exists(submit_json):
        with open(submit_json, 'r', encoding='utf-8') as f:
            for item in json.load(f):
                submit_data[item['bucket']] = item

    all_buckets = list(deploy_data.keys()) or list(submit_data.keys())
    if not all_buckets:
        return

    def _folder_sort_key(bucket):
        d = deploy_data.get(bucket, {})
        s = submit_data.get(bucket, {})
        foldering = d.get('foldering', '') or s.get('foldering', '')
        parts = foldering.replace('folder_', '').split('_')
        try:
            return int(parts[0])
        except (ValueError, IndexError):
            return foldering

    all_buckets.sort(key=_folder_sort_key)

    print()
    print("=" * 130)
    print("  FULL DEPLOY SUMMARY")
    print("=" * 130)
    print(f"  {'No':>3} | {'Bucket Name':25s} | {'Source Database':20s} | {'Site URL':40s} | {'Files':>5} | {'Status':7s} | {'Submit':7s}")
    print("-" * 130)

    ok_count = 0
    skip_count = 0
    fail_count = 0

    for i, bucket in enumerate(all_buckets, 1):
        d = deploy_data.get(bucket, {})
        s = submit_data.get(bucket, {})

        bucket_display = (bucket[:22] + '...') if len(bucket) > 25 else bucket
        source = d.get('source', '') or s.get('source', '')
        source_display = (source[:17] + '...') if len(source) > 20 else source
        url = d.get('url', '')
        url_display = (url[:37] + '...') if len(url) > 40 else url
        files = d.get('files', 0)
        status = d.get('status', '-')
        submit = s.get('submit', '-')

        if status == 'SKIP':
            skip_count += 1
        elif status == 'FAILED' or submit == 'FAILED':
            fail_count += 1
        else:
            ok_count += 1

        print(f"  {i:3d} | {bucket_display:25s} | {source_display:20s} | {url_display:40s} | {files:5d} | {status:7s} | {submit:7s}")

    print("-" * 130)
    print(f"  Total: {len(all_buckets)} | OK: {ok_count} | SKIP: {skip_count} | FAIL: {fail_count}")
    print("=" * 130)


def generate_unified_report():
    report_folder = os.path.join(ROOT_DIR, 'report')
    deploy_json = os.path.join(report_folder, 'deploy-summary.json')
    submit_json = os.path.join(report_folder, 'submit-summary.json')

    deploy_data = {}
    if os.path.exists(deploy_json):
        with open(deploy_json, 'r', encoding='utf-8') as f:
            for item in json.load(f):
                deploy_data[item['bucket']] = item

    submit_data = {}
    if os.path.exists(submit_json):
        with open(submit_json, 'r', encoding='utf-8') as f:
            for item in json.load(f):
                submit_data[item['bucket']] = item

    all_buckets = list(deploy_data.keys()) or list(submit_data.keys())
    if not all_buckets:
        return None

    def _folder_sort_key(bucket):
        d = deploy_data.get(bucket, {})
        s = submit_data.get(bucket, {})
        foldering = d.get('foldering', '') or s.get('foldering', '')
        parts = foldering.replace('folder_', '').split('_')
        try:
            return int(parts[0])
        except (ValueError, IndexError):
            return foldering

    all_buckets.sort(key=_folder_sort_key)

    ts = datetime.now().strftime("%Y%m%d_%H%M%S")
    csv_file = os.path.join(report_folder, f"report-{ts}.csv")

    with open(csv_file, 'w', newline='', encoding='utf-8') as f:
        writer = csv.writer(f)
        writer.writerow([
            'No', 'Bucket', 'Folder', 'Name', 'Source Database', 'Files',
            'Status', 'Created', 'Public', 'Uploaded',
            'Submit', 'URLs', 'URL', 'Error', 'Duration'
        ])

        for i, bucket in enumerate(all_buckets, 1):
            d = deploy_data.get(bucket, {})
            s = submit_data.get(bucket, {})

            deploy_status = d.get('status', '-')
            created = d.get('create', '-')
            public = d.get('public', '-')
            uploaded = d.get('upload', '-')
            submit_status = s.get('submit', '-')
            url_count = s.get('url_count', 0)
            url = d.get('url', '')
            error = d.get('error', '')
            duration = d.get('duration', '')
            source = d.get('source', '') or s.get('source', '')

            if deploy_status == 'FAILED' or submit_status == 'FAILED':
                overall = 'FAILED'
            elif deploy_status == 'SKIP':
                overall = 'SKIP'
            elif deploy_status == 'SUCCESS' and submit_status == 'SUCCESS':
                overall = 'SUCCESS'
            elif deploy_status == 'SUCCESS':
                overall = 'SUCCESS'
            else:
                overall = 'FAILED'

            writer.writerow([
                i,
                bucket,
                d.get('foldering', ''),
                d.get('name', ''),
                source,
                d.get('files', 0),
                overall,
                created,
                public,
                uploaded,
                submit_status,
                url_count,
                url,
                error,
                duration,
            ])

    print(f"\nReport saved: {csv_file}")

    if os.path.exists(deploy_json):
        os.remove(deploy_json)
    if os.path.exists(submit_json):
        os.remove(submit_json)

    return csv_file


def run_full_deploy():
    print("=" * 40)
    print("   Full Deploy Pipeline")
    print("=" * 40)
    print()
    print("Running the following steps sequentially:")
    print("  0. Generate CREATE.csv")
    print("  1. Export articles to HTML (Go)")
    print("  2. Create buckets & upload to GCS")
    print("  3. Submit to IndexNow")
    print()

    config = get_config()
    default_split = config.get('split_size', 5000)
    default_template = config.get('template', 'modern')
    worker_count = config.get('worker_count', 4)

    go_exe = os.path.join(ROOT_DIR, 'go', 'exporter.exe')
    if not os.path.exists(go_exe):
        print("Building Go exporter...")
        build_result = subprocess.run(
            ['go', 'build', '-o', 'exporter.exe', '.'],
            cwd=os.path.join(ROOT_DIR, 'go')
        )
        if build_result.returncode != 0:
            print("Go exporter build failed!")
            return
        print("Build successful.")

    print()
    print("=" * 40)
    print("   Export Settings")
    print("=" * 40)
    print()

    split_input = input(f"Split size [{default_split}]: ").strip()
    split_size = int(split_input) if split_input.isdigit() else default_split

    print()
    print("Available templates:")
    list_result = subprocess.run(
        [go_exe, '--list-templates'],
        cwd=ROOT_DIR, capture_output=True, text=True
    )
    templates = []
    if list_result.returncode == 0:
        for line in list_result.stdout.strip().splitlines():
            if '|' in line:
                num, name = line.split('|', 1)
                templates.append(name.strip())
                marker = " (current)" if name.strip() == default_template else ""
                print(f"  {num.strip()}. {name.strip()}{marker}")
    print()

    template_input = input(f"Template number or name [{default_template}]: ").strip()
    if template_input.isdigit():
        idx = int(template_input) - 1
        if 0 <= idx < len(templates):
            selected_template = templates[idx]
        else:
            selected_template = default_template
    elif template_input:
        selected_template = template_input
    else:
        selected_template = default_template

    print()
    print(f"Split size : {split_size}")
    print(f"Template   : {selected_template}")
    print()

    print("=" * 40)
    print("   Step 0/4: Generate CREATE.csv")
    print("=" * 40)
    print()
    from generate_create_csv import main as gen_main
    gen_main(split_size=split_size)

    print()
    print("=" * 40)
    print("   Step 1/4: Export Articles (Go)")
    print("=" * 40)
    print()
    export_result = subprocess.run(
        [go_exe, f'--split-size={split_size}', f'--template={selected_template}', f'--workers={worker_count}'],
        cwd=ROOT_DIR
    )
    if export_result.returncode != 0:
        print(f"Export failed with exit code {export_result.returncode}")
        return

    print()
    print("=" * 40)
    print("   Step 2/4: Create & Upload to GCS")
    print("=" * 40)
    print()
    run_deploy(auto=True)

    print()
    print("=" * 40)
    print("   Step 3/4: Submit to IndexNow")
    print("=" * 40)
    print()
    run_submit(auto=True)

    print_summary()
    generate_unified_report()

    print()
    print("=" * 40)
    print("   Full Deploy completed!")
    print("=" * 40)


def run_full_auto():
    print("=" * 40)
    print("   FULL AUTO Pipeline")
    print("=" * 40)
    print()
    print("Running all steps sequentially:")
    print("  0. Convert keywords to database")
    print("  1. Scrape images from Pinterest")
    print("  2. Generate AI titles")
    print("  3. Generate AI articles")
    print("  4. Update status")
    print("  5. Generate CREATE.csv")
    print("  6. Export articles to HTML (Go)")
    print("  7. Create buckets & upload to GCS")
    print("  8. Submit to IndexNow")
    print()

    config = get_config()
    split_size = config.get('split_size', 5000)
    selected_template = config.get('template', 'modern')
    worker_count = config.get('worker_count', 4)

    go_exe = os.path.join(ROOT_DIR, 'go', 'exporter.exe')
    if not os.path.exists(go_exe):
        print("Building Go exporter...")
        build_result = subprocess.run(
            ['go', 'build', '-o', 'exporter.exe', '.'],
            cwd=os.path.join(ROOT_DIR, 'go')
        )
        if build_result.returncode != 0:
            print("Go exporter build failed!")
            return
        print("Build successful.")

    print()
    print("=" * 40)
    print("   Step 0/9: Convert Keywords")
    print("=" * 40)
    print()
    from convert import main as convert_main
    convert_main()

    print()
    print("=" * 40)
    print("   Step 1/9: Scrape Images")
    print("=" * 40)
    print()
    from scrape import main as scrape_main
    scrape_main()

    print()
    print("=" * 40)
    print("   Step 2/9: Generate AI Titles")
    print("=" * 40)
    print()
    from ai_generator import run_ai_generation
    asyncio.run(run_ai_generation("title"))

    print()
    print("=" * 40)
    print("   Step 3/9: Generate AI Articles")
    print("=" * 40)
    print()
    asyncio.run(run_ai_generation("article"))

    print()
    print("=" * 40)
    print("   Step 4/9: Update Status")
    print("=" * 40)
    print()
    from pinscrape.database import update_all_status
    from pinscrape.database import get_all_db_files
    for db_file in get_all_db_files():
        result = update_all_status(str(db_file))
        print(f"  {db_file.name}: status updated -> 0:{result['status_0']} 1:{result['status_1']} 2:{result['status_2']}")

    print()
    print("=" * 40)
    print("   Step 5/9: Generate CREATE.csv")
    print("=" * 40)
    print()
    from generate_create_csv import main as gen_main
    gen_main(split_size=split_size)

    print()
    print("=" * 40)
    print("   Step 6/9: Export Articles (Go)")
    print("=" * 40)
    print()
    export_result = subprocess.run(
        [go_exe, f'--split-size={split_size}', f'--template={selected_template}', f'--workers={worker_count}'],
        cwd=ROOT_DIR
    )
    if export_result.returncode != 0:
        print(f"Export failed with exit code {export_result.returncode}")
        return

    print()
    print("=" * 40)
    print("   Step 7/9: Create & Upload to GCS")
    print("=" * 40)
    print()
    run_deploy(auto=True)

    print()
    print("=" * 40)
    print("   Step 8/9: Submit to IndexNow")
    print("=" * 40)
    print()
    run_submit(auto=True)

    print_summary()
    generate_unified_report()

    print()
    print("=" * 40)
    print("   FULL AUTO completed!")
    print("=" * 40)


def generate_scrape_report():
    from pinscrape.database import get_all_db_files, get_db_connection

    db_files = get_all_db_files()
    if not db_files:
        print("No databases found for report.")
        return

    report_folder = os.path.join(ROOT_DIR, 'report')
    os.makedirs(report_folder, exist_ok=True)

    for db_file in db_files:
        db_path = str(db_file)
        db_name = os.path.splitext(os.path.basename(db_path))[0]

        conn = get_db_connection(db_path)
        total = conn.execute("SELECT COUNT(*) FROM posts").fetchone()[0]
        if total == 0:
            conn.close()
            continue

        images_done = conn.execute(
            "SELECT COUNT(*) FROM posts WHERE images IS NOT NULL AND images != '' AND images != '[]'"
        ).fetchone()[0]
        titles_done = conn.execute(
            "SELECT COUNT(*) FROM posts WHERE ai_title IS NOT NULL AND ai_title != ''"
        ).fetchone()[0]
        articles_done = conn.execute(
            "SELECT COUNT(*) FROM posts WHERE ai_content IS NOT NULL AND ai_content != ''"
        ).fetchone()[0]
        conn.close()

        img_pct = round(images_done / total * 100) if total else 0
        ttl_pct = round(titles_done / total * 100) if total else 0
        art_pct = round(articles_done / total * 100) if total else 0

        report_content = (
            f"Image Scrapped : {images_done}/{total} ({img_pct}%)\n"
            f"Title Created : {titles_done}/{total} ({ttl_pct}%)\n"
            f"Article Created : {articles_done}/{total} ({art_pct}%)\n"
        )

        report_path = os.path.join(report_folder, f"scrape-{db_name}.txt")
        with open(report_path, 'w', encoding='utf-8') as f:
            f.write(report_content)

        print(f"\nReport saved: {report_path}")
        print(report_content)


def run_workflow():
    print("=" * 40)
    print("   Full Workflow")
    print("=" * 40)
    print()
    print("Running the following steps sequentially:")
    print("  1. Scrape images from Pinterest")
    print("  2. Generate AI titles")
    print("  3. Generate AI articles")
    print("  4. Update status")
    print()

    print("=" * 40)
    print("   Step 1/4: Scrape Images")
    print("=" * 40)
    print()
    from scrape import main as scrape_main
    scrape_main()

    print()
    print("=" * 40)
    print("   Step 2/4: Generate AI Titles")
    print("=" * 40)
    print()
    from ai_generator import run_ai_generation
    asyncio.run(run_ai_generation("title"))

    print()
    print("=" * 40)
    print("   Step 3/4: Generate AI Articles")
    print("=" * 40)
    print()
    asyncio.run(run_ai_generation("article"))

    print()
    print("=" * 40)
    print("   Step 4/4: Update Status")
    print("=" * 40)
    print()
    from pinscrape.database import update_all_status
    from pinscrape.database import get_all_db_files
    for db_file in get_all_db_files():
        result = update_all_status(str(db_file))
        print(f"  {db_file.name}: status updated -> 0:{result['status_0']} 1:{result['status_1']} 2:{result['status_2']}")

    generate_scrape_report()

    print()
    print("=" * 40)
    print("   Workflow completed!")
    print("=" * 40)


def run_workflow_snippet():
    print("=" * 40)
    print("   Full Workflow Snippet (Scrape + Snippet)")
    print("=" * 40)
    print()
    print("Running the following steps sequentially:")
    print("  1. Scrape images from Pinterest")
    print("  2. Scrape descriptions + related keywords")
    print()

    print("=" * 40)
    print("   Step 1/2: Scrape Images")
    print("=" * 40)
    print()
    from scrape import main as scrape_main
    scrape_main()

    print()
    print("=" * 40)
    print("   Step 2/2: Scrape Descriptions")
    print("=" * 40)
    print()
    from scrape_description import main as scrape_desc_main
    scrape_desc_main()

    generate_scrape_report()

    print()
    print("=" * 40)
    print("   Workflow Snippet completed!")
    print("=" * 40)


def run_workflow_snippet_ai():
    print("=" * 40)
    print("   Full Workflow Snippet + AI Title")
    print("=" * 40)
    print()
    print("Running the following steps sequentially:")
    print("  1. Scrape images from Pinterest")
    print("  2. Scrape descriptions + related keywords")
    print("  3. Generate AI titles")
    print()

    print("=" * 40)
    print("   Step 1/3: Scrape Images")
    print("=" * 40)
    print()
    from scrape import main as scrape_main
    scrape_main()

    print()
    print("=" * 40)
    print("   Step 2/3: Scrape Descriptions")
    print("=" * 40)
    print()
    from scrape_description import main as scrape_desc_main
    scrape_desc_main()

    print()
    print("=" * 40)
    print("   Step 3/3: Generate AI Titles")
    print("=" * 40)
    print()
    from ai_generator import run_ai_generation
    asyncio.run(run_ai_generation("title"))

    generate_scrape_report()

    print()
    print("=" * 40)
    print("   Workflow Snippet + AI Title completed!")
    print("=" * 40)


def run_snippet_export():
    print("=" * 40)
    print("   Export Snippet Articles (Go)")
    print("=" * 40)
    print()

    config = get_config()
    default_split = config.get('split_size', 5000)
    default_template = config.get('template', 'modern')
    worker_count = config.get('worker_count', 4)

    snippet_exe = os.path.join(ROOT_DIR, 'go-snippet', 'snippet-exporter.exe')
    if not os.path.exists(snippet_exe):
        print("Building snippet exporter...")
        build_result = subprocess.run(
            ['go', 'build', '-o', 'snippet-exporter.exe', '.'],
            cwd=os.path.join(ROOT_DIR, 'go-snippet')
        )
        if build_result.returncode != 0:
            print("Snippet exporter build failed!")
            return
        print("Build successful.")

    print()
    print("=" * 40)
    print("   Step 0/1: Generate CREATE.csv")
    print("=" * 40)
    print()
    from generate_create_csv import main as gen_main
    gen_main(split_size=default_split)

    print()
    print("=" * 40)
    print("   Step 1/1: Export Snippet Articles")
    print("=" * 40)
    print()
    export_result = subprocess.run(
        [snippet_exe, '--interactive'],
        cwd=ROOT_DIR
    )
    if export_result.returncode != 0:
        print(f"Export failed with exit code {export_result.returncode}")
        return

    print()
    print("=" * 40)
    print("   Snippet Export completed!")
    print("=" * 40)


def run_snippet_deploy():
    print("=" * 40)
    print("   Snippet Deploy Pipeline")
    print("=" * 40)
    print()
    print("Running the following steps sequentially:")
    print("  0. Generate CREATE.csv")
    print("  1. Export snippet articles to HTML (Go)")
    print("  2. Create buckets & upload to GCS")
    print("  3. Submit to IndexNow")
    print()

    config = get_config()
    default_split = config.get('split_size', 5000)
    default_template = config.get('template', 'modern')
    worker_count = config.get('worker_count', 4)

    snippet_exe = os.path.join(ROOT_DIR, 'go-snippet', 'snippet-exporter.exe')
    if not os.path.exists(snippet_exe):
        print("Building snippet exporter...")
        build_result = subprocess.run(
            ['go', 'build', '-o', 'snippet-exporter.exe', '.'],
            cwd=os.path.join(ROOT_DIR, 'go-snippet')
        )
        if build_result.returncode != 0:
            print("Snippet exporter build failed!")
            return
        print("Build successful.")

    print()
    print("=" * 40)
    print("   Export Settings")
    print("=" * 40)
    print()

    split_input = input(f"Split size [{default_split}]: ").strip()
    split_size = int(split_input) if split_input.isdigit() else default_split

    print()
    print("Available templates:")
    list_result = subprocess.run(
        [snippet_exe, '--list-templates'],
        cwd=ROOT_DIR, capture_output=True, text=True
    )
    templates = []
    if list_result.returncode == 0:
        for line in list_result.stdout.strip().splitlines():
            if '|' in line:
                num, name = line.split('|', 1)
                templates.append(name.strip())
                marker = " (current)" if name.strip() == default_template else ""
                print(f"  {num.strip()}. {name.strip()}{marker}")
    print()

    template_input = input(f"Template number or name [{default_template}]: ").strip()
    if template_input.isdigit():
        idx = int(template_input) - 1
        if 0 <= idx < len(templates):
            selected_template = templates[idx]
        else:
            selected_template = default_template
    elif template_input:
        selected_template = template_input
    else:
        selected_template = default_template

    print()
    print(f"Split size : {split_size}")
    print(f"Template   : {selected_template}")
    print()

    print("=" * 40)
    print("   Step 0/3: Generate CREATE.csv")
    print("=" * 40)
    print()
    from generate_create_csv import main as gen_main
    gen_main(split_size=split_size)

    print()
    print("=" * 40)
    print("   Step 1/3: Export Snippet Articles (Go)")
    print("=" * 40)
    print()
    export_result = subprocess.run(
        [snippet_exe, f'--split-size={split_size}', f'--template={selected_template}', f'--workers={worker_count}'],
        cwd=ROOT_DIR
    )
    if export_result.returncode != 0:
        print(f"Export failed with exit code {export_result.returncode}")
        return

    print()
    print("=" * 40)
    print("   Step 2/3: Create & Upload to GCS")
    print("=" * 40)
    print()
    run_deploy(auto=True)

    print()
    print("=" * 40)
    print("   Step 3/3: Submit to IndexNow")
    print("=" * 40)
    print()
    run_submit(auto=True)

    print_summary()
    generate_unified_report()

    print()
    print("=" * 40)
    print("   Snippet Deploy completed!")
    print("=" * 40)


def run_full_auto_snippet():
    print("=" * 40)
    print("   FULL AUTO SNIPPET Pipeline")
    print("=" * 40)
    print()
    print("Running all steps sequentially:")
    print("  0. Convert keywords to database")
    print("  1. Scrape images from Pinterest")
    print("  2. Scrape descriptions + related keywords")
    print("  3. Generate CREATE.csv")
    print("  4. Export snippet articles to HTML (Go)")
    print("  5. Create buckets & upload to GCS")
    print("  6. Submit to IndexNow")
    print()

    config = get_config()
    split_size = config.get('split_size', 5000)
    selected_template = config.get('template', 'modern')
    worker_count = config.get('worker_count', 4)

    snippet_exe = os.path.join(ROOT_DIR, 'go-snippet', 'snippet-exporter.exe')
    if not os.path.exists(snippet_exe):
        print("Building snippet exporter...")
        build_result = subprocess.run(
            ['go', 'build', '-o', 'snippet-exporter.exe', '.'],
            cwd=os.path.join(ROOT_DIR, 'go-snippet')
        )
        if build_result.returncode != 0:
            print("Snippet exporter build failed!")
            return
        print("Build successful.")

    print()
    print("=" * 40)
    print("   Step 0/7: Convert Keywords")
    print("=" * 40)
    print()
    from convert import main as convert_main
    convert_main()

    print()
    print("=" * 40)
    print("   Step 1/7: Scrape Images")
    print("=" * 40)
    print()
    from scrape import main as scrape_main
    scrape_main()

    print()
    print("=" * 40)
    print("   Step 2/7: Scrape Descriptions")
    print("=" * 40)
    print()
    from scrape_description import main as scrape_desc_main
    scrape_desc_main()

    print()
    print("=" * 40)
    print("   Step 3/7: Generate CREATE.csv")
    print("=" * 40)
    print()
    from generate_create_csv import main as gen_main
    gen_main(split_size=split_size)

    print()
    print("=" * 40)
    print("   Step 4/7: Export Snippet Articles (Go)")
    print("=" * 40)
    print()
    export_result = subprocess.run(
        [snippet_exe, f'--split-size={split_size}', f'--template={selected_template}', f'--workers={worker_count}'],
        cwd=ROOT_DIR
    )
    if export_result.returncode != 0:
        print(f"Export failed with exit code {export_result.returncode}")
        return

    print()
    print("=" * 40)
    print("   Step 5/7: Create & Upload to GCS")
    print("=" * 40)
    print()
    run_deploy(auto=True)

    print()
    print("=" * 40)
    print("   Step 6/7: Submit to IndexNow")
    print("=" * 40)
    print()
    run_submit(auto=True)

    print_summary()
    generate_unified_report()

    print()
    print("=" * 40)
    print("   FULL AUTO SNIPPET completed!")
    print("=" * 40)


def run_full_auto_snippet_ultimate():
    print("=" * 40)
    print("   FULL AUTO SNIPPET ULTIMATE Pipeline")
    print("=" * 40)
    print()
    print("Running all steps sequentially:")
    print("  0. Convert keywords to database")
    print("  1-3. Scrape images + snippet (3 rounds)")
    print("  4. Generate CREATE.csv")
    print("  5. Export snippet articles to HTML (Go)")
    print("  6. Create buckets & upload to GCS")
    print("  7. Submit to IndexNow")
    print()

    config = get_config()
    split_size = config.get('split_size', 5000)
    selected_template = config.get('template', 'modern')
    worker_count = config.get('worker_count', 4)

    snippet_exe = os.path.join(ROOT_DIR, 'go-snippet', 'snippet-exporter.exe')
    if not os.path.exists(snippet_exe):
        print("Building snippet exporter...")
        build_result = subprocess.run(
            ['go', 'build', '-o', 'snippet-exporter.exe', '.'],
            cwd=os.path.join(ROOT_DIR, 'go-snippet')
        )
        if build_result.returncode != 0:
            print("Snippet exporter build failed!")
            return
        print("Build successful.")

    print()
    print("=" * 40)
    print("   Step 0/7: Convert Keywords")
    print("=" * 40)
    print()
    from convert import main as convert_main
    convert_main()

    for round_num in range(1, 4):
        print()
        print("=" * 40)
        print(f"   Step 1.{round_num}/3: Scrape Images (Round {round_num}/3)")
        print("=" * 40)
        print()
        from scrape import main as scrape_main
        scrape_main()

        print()
        print("=" * 40)
        print(f"   Step 2.{round_num}/3: Scrape Descriptions (Round {round_num}/3)")
        print("=" * 40)
        print()
        from scrape_description import main as scrape_desc_main
        scrape_desc_main()

    print()
    print("=" * 40)
    print("   Step 4/7: Generate CREATE.csv")
    print("=" * 40)
    print()
    from generate_create_csv import main as gen_main
    gen_main(split_size=split_size)

    print()
    print("=" * 40)
    print("   Step 5/7: Export Snippet Articles (Go)")
    print("=" * 40)
    print()
    export_result = subprocess.run(
        [snippet_exe, f'--split-size={split_size}', f'--template={selected_template}', f'--workers={worker_count}'],
        cwd=ROOT_DIR
    )
    if export_result.returncode != 0:
        print(f"Export failed with exit code {export_result.returncode}")
        return

    print()
    print("=" * 40)
    print("   Step 6/7: Create & Upload to GCS")
    print("=" * 40)
    print()
    run_deploy(auto=True)

    print()
    print("=" * 40)
    print("   Step 7/7: Submit to IndexNow")
    print("=" * 40)
    print()
    run_submit(auto=True)

    print_summary()
    generate_unified_report()

    print()
    print("=" * 40)
    print("   FULL AUTO SNIPPET ULTIMATE completed!")
    print("=" * 40)


def main():
    if len(sys.argv) < 2:
        print("Usage: python scripts/cli.py <command>")
        print()
        print("Commands:")
        print("  convert       - Convert keywords to database")
        print("  scrape        - Scrape images from Pinterest")
        print("  scrape-description - Scrape descriptions to snippet column")
        print("  ai title      - Generate AI titles")
        print("  ai article    - Generate AI articles")
        print("  delete-ai     - Delete all AI content")
        print("  delete-ai-title - Delete AI titles only")
        print("  workflow      - Full workflow (scrape + AI title + AI article)")
        print("  workflow-snippet - Full workflow snippet (scrape + scrape description)")
        print("  workflow-snippet-ai - Full workflow snippet + AI title (scrape + snippet + AI title)")
        print("  full-auto     - Full auto (scrape + AI + export + deploy + submit)")
        print("  deploy        - Create buckets & upload to GCS")
        print("  submit        - Submit to IndexNow")
        print("  full-deploy   - Export + Deploy + Submit")
        print("  snippet-export     - Export snippet articles only")
        print("  snippet-deploy     - Export snippet + Deploy + Submit")
        print("  full-auto-snippet  - Full auto snippet pipeline")
        print("  full-auto-snippet-ultimate - Full auto snippet ultimate (3x scrape + export + deploy)")
        return

    cmd = sys.argv[1]

    if cmd == "convert":
        from convert import main as convert_main
        convert_main()

    elif cmd == "scrape":
        from scrape import main as scrape_main
        scrape_main()

    elif cmd == "scrape-description":
        from scrape_description import main as scrape_desc_main
        scrape_desc_main()

    elif cmd == "ai":
        if len(sys.argv) < 3 or sys.argv[2] not in ("title", "article"):
            print("Usage: python scripts/cli.py ai <title|article>")
            return
        from ai_generator import run_ai_generation
        asyncio.run(run_ai_generation(sys.argv[2]))

    elif cmd == "workflow":
        run_workflow()

    elif cmd == "workflow-snippet":
        run_workflow_snippet()

    elif cmd == "workflow-snippet-ai":
        run_workflow_snippet_ai()

    elif cmd == "deploy":
        auto = "--auto" in sys.argv
        run_deploy(auto=auto)

    elif cmd == "submit":
        auto = "--auto" in sys.argv
        run_submit(auto=auto)

    elif cmd == "delete-ai":
        from delete_ai_content import delete_ai_content
        delete_ai_content()
        print("Done.")

    elif cmd == "delete-ai-title":
        from delete_ai_title import delete_ai_title
        delete_ai_title()
        print("\nDone.")

    elif cmd == "full-auto":
        run_full_auto()

    elif cmd == "full-deploy":
        run_full_deploy()

    elif cmd == "snippet-export":
        run_snippet_export()

    elif cmd == "snippet-deploy":
        run_snippet_deploy()

    elif cmd == "full-auto-snippet":
        run_full_auto_snippet()

    elif cmd == "full-auto-snippet-ultimate":
        run_full_auto_snippet_ultimate()

    elif cmd == "full-deploy-report":
        print_summary()
        generate_unified_report()

    elif cmd == "full-deploy-generate":
        from generate_create_csv import main as gen_main
        split = None
        if len(sys.argv) > 2 and sys.argv[2].isdigit():
            split = int(sys.argv[2])
        gen_main(split_size=split)

    else:
        print(f"Unknown command: {cmd}")
        print("Run 'python scripts/cli.py' for usage info.")


if __name__ == "__main__":
    main()
