#!/usr/bin/env python3
import os
import sys
from pathlib import Path


def load_env(env_path: Path) -> dict:
    data = {}
    if not env_path.exists():
        return data
    for line in env_path.read_text(encoding='utf-8').splitlines():
        line = line.strip()
        if not line or line.startswith('#') or '=' not in line:
            continue
        key, value = line.split('=', 1)
        data[key.strip()] = value.strip()
    return data


def load_all_env():
    env_files = [
        Path(__file__).with_name('.env'),
        Path(__file__).resolve().parent.parent / '.env',
    ]
    merged = {}
    for env_file in env_files:
        merged.update(load_env(env_file))
    return {**os.environ, **merged}


def get_mysql_connector():
    try:
        import mysql.connector  # type: ignore

        return mysql.connector
    except Exception:
        print('mysql-connector-python is required. Install with: pip install mysql-connector-python', file=sys.stderr)
        sys.exit(1)


def main():
    env = load_all_env()
    required = ['DB_HOST', 'DB_USER', 'DB_PASSWORD', 'DB_NAME']
    if not all(env.get(key) for key in required):
        print('Missing DB_* settings. Check your .env or environment variables.', file=sys.stderr)
        sys.exit(1)

    mysql = get_mysql_connector()
    conn = mysql.connect(
        host=env['DB_HOST'],
        user=env['DB_USER'],
        password=env['DB_PASSWORD'],
        port=int(env.get('DB_PORT', '23306')),
        database=env['DB_NAME'],
        charset='utf8mb4',
    )
    cursor = conn.cursor()

    statements = [
        """
        CREATE TABLE IF NOT EXISTS onetakeduo_user_state (
          user_id VARCHAR(36) PRIMARY KEY,
          guest_serial VARCHAR(255) NOT NULL,
          is_pro TINYINT(1) NOT NULL DEFAULT 0,
          first_clean_save_used TINYINT(1) NOT NULL DEFAULT 0,
          daily_free_save_limit INT NOT NULL DEFAULT 3,
          free_saves_used_today INT NOT NULL DEFAULT 0,
          last_quota_reset_date DATE NULL,
          reward_save_credits_remaining INT NOT NULL DEFAULT 0,
          reward_save_credits_used_today INT NOT NULL DEFAULT 0,
          reward_save_credits_daily_limit INT NOT NULL DEFAULT 3,
          no_watermark_credit_remaining INT NOT NULL DEFAULT 0,
          no_watermark_credit_used_today INT NOT NULL DEFAULT 0,
          no_watermark_credit_daily_limit INT NOT NULL DEFAULT 3,
          created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
          updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
          INDEX idx_onetakeduo_user_state_guest_serial (guest_serial),
          CONSTRAINT fk_onetakeduo_user_state_user
            FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
        """,
        """
        CREATE TABLE IF NOT EXISTS onetakeduo_purchases (
          id VARCHAR(36) PRIMARY KEY,
          user_id VARCHAR(36) NOT NULL,
          guest_serial VARCHAR(255) NOT NULL,
          platform ENUM('ios', 'android') NOT NULL,
          product_id VARCHAR(120) NOT NULL,
          transaction_id VARCHAR(255) NULL,
          original_transaction_id VARCHAR(255) NULL,
          purchase_token_or_receipt LONGTEXT NULL,
          price DECIMAL(10, 2) NOT NULL DEFAULT 0,
          currency VARCHAR(10) NOT NULL DEFAULT 'KRW',
          status ENUM('pending', 'completed', 'cancelled', 'failed', 'restored', 'expired') NOT NULL DEFAULT 'pending',
          verified_at DATETIME NULL,
          purchased_at DATETIME DEFAULT CURRENT_TIMESTAMP,
          created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
          updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
          INDEX idx_onetakeduo_purchases_user (user_id),
          INDEX idx_onetakeduo_purchases_guest_serial (guest_serial),
          INDEX idx_onetakeduo_purchases_product_status (product_id, status),
          INDEX idx_onetakeduo_purchases_transaction (transaction_id),
          CONSTRAINT fk_onetakeduo_purchases_user
            FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
        """,
        """
        CREATE TABLE IF NOT EXISTS onetakeduo_save_sessions (
          id VARCHAR(36) PRIMARY KEY,
          user_id VARCHAR(36) NOT NULL,
          guest_serial VARCHAR(255) NOT NULL,
          capture_mode ENUM('photo', 'dual', 'vertical', 'horizontal') NOT NULL DEFAULT 'dual',
          resolution VARCHAR(40) NOT NULL DEFAULT '1080P',
          fps INT NOT NULL DEFAULT 30,
          duration_ms BIGINT NOT NULL DEFAULT 0,
          watermark_applied TINYINT(1) NOT NULL DEFAULT 0,
          status ENUM('recording', 'saving', 'saved', 'failed') NOT NULL DEFAULT 'recording',
          vertical_file_name VARCHAR(255) NULL,
          horizontal_file_name VARCHAR(255) NULL,
          vertical_duration_ms BIGINT NOT NULL DEFAULT 0,
          horizontal_duration_ms BIGINT NOT NULL DEFAULT 0,
          save_count_consumed TINYINT(1) NOT NULL DEFAULT 0,
          failure_reason TEXT NULL,
          started_at DATETIME DEFAULT CURRENT_TIMESTAMP,
          completed_at DATETIME NULL,
          created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
          updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
          INDEX idx_onetakeduo_save_sessions_user (user_id),
          INDEX idx_onetakeduo_save_sessions_guest_serial (guest_serial),
          INDEX idx_onetakeduo_save_sessions_status (status),
          CONSTRAINT fk_onetakeduo_save_sessions_user
            FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
        """,
        """
        CREATE TABLE IF NOT EXISTS onetakeduo_reward_claims (
          id VARCHAR(36) PRIMARY KEY,
          user_id VARCHAR(36) NOT NULL,
          guest_serial VARCHAR(255) NOT NULL,
          reward_type ENUM('extra_save', 'no_watermark') NOT NULL,
          ad_network VARCHAR(40) NOT NULL DEFAULT 'admob',
          ad_unit_id VARCHAR(255) NULL,
          reward_amount INT NOT NULL DEFAULT 1,
          impression_id VARCHAR(255) NULL,
          status ENUM('completed', 'rejected') NOT NULL DEFAULT 'completed',
          created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
          INDEX idx_onetakeduo_reward_claims_user (user_id),
          INDEX idx_onetakeduo_reward_claims_type (reward_type),
          CONSTRAINT fk_onetakeduo_reward_claims_user
            FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
        """,
        """
        CREATE TABLE IF NOT EXISTS onetakeduo_ad_settings (
          id INT PRIMARY KEY AUTO_INCREMENT,
          ad_mode ENUM('test', 'release') NOT NULL DEFAULT 'test',
          ios_banner_ad_id VARCHAR(120) NOT NULL DEFAULT '',
          ios_rewarded_ad_id VARCHAR(120) NOT NULL DEFAULT '',
          android_banner_ad_id VARCHAR(120) NOT NULL DEFAULT '',
          android_rewarded_ad_id VARCHAR(120) NOT NULL DEFAULT '',
          test_ios_banner_ad_id VARCHAR(120) NOT NULL DEFAULT 'ca-app-pub-3940256099942544/2934735716',
          test_ios_rewarded_ad_id VARCHAR(120) NOT NULL DEFAULT 'ca-app-pub-3940256099942544/1712485313',
          test_android_banner_ad_id VARCHAR(120) NOT NULL DEFAULT 'ca-app-pub-3940256099942544/6300978111',
          test_android_rewarded_ad_id VARCHAR(120) NOT NULL DEFAULT 'ca-app-pub-3940256099942544/5224354917',
          result_banner_enabled TINYINT(1) NOT NULL DEFAULT 1,
          settings_banner_enabled TINYINT(1) NOT NULL DEFAULT 1,
          paywall_banner_enabled TINYINT(1) NOT NULL DEFAULT 1,
          updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
          created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
        """,
        """
        CREATE TABLE IF NOT EXISTS onetakeduo_event_logs (
          id VARCHAR(36) PRIMARY KEY,
          user_id VARCHAR(36) NULL,
          guest_serial VARCHAR(255) NULL,
          event_name VARCHAR(80) NOT NULL,
          event_params_json LONGTEXT NULL,
          platform VARCHAR(20) NULL,
          created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
          INDEX idx_onetakeduo_event_logs_event (event_name),
          INDEX idx_onetakeduo_event_logs_created (created_at),
          INDEX idx_onetakeduo_event_logs_guest (guest_serial)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
        """,
        """
        INSERT IGNORE INTO onetakeduo_ad_settings (
          id,
          ad_mode,
          ios_banner_ad_id,
          ios_rewarded_ad_id,
          android_banner_ad_id,
          android_rewarded_ad_id,
          test_ios_banner_ad_id,
          test_ios_rewarded_ad_id,
          test_android_banner_ad_id,
          test_android_rewarded_ad_id,
          result_banner_enabled,
          settings_banner_enabled,
          paywall_banner_enabled
        ) VALUES (
          1,
          'test',
          '',
          '',
          '',
          '',
          'ca-app-pub-3940256099942544/2934735716',
          'ca-app-pub-3940256099942544/1712485313',
          'ca-app-pub-3940256099942544/6300978111',
          'ca-app-pub-3940256099942544/5224354917',
          1,
          1,
          1
        )
        """,
    ]

    for statement in statements:
        cursor.execute(statement)

    conn.commit()
    cursor.close()
    conn.close()
    print('OneTakeDuo schema synced successfully.')


if __name__ == '__main__':
    main()
