import psycopg2
from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT

# Конфигурация для подключения к PostgreSQL
DB_CONFIG = {
    'host': '127.0.0.1',
    'user': 'postgres',
    'password': 'PostgresPass123'  # Замените на ваш пароль
}

# Конфигурация для создания базы данных
DB_NAME = 'aliexpress_automation'
DB_USER = 'automation_user'
DB_PASSWORD = 'AutoPass123'

def create_database():
    """Создание базы данных и пользователя"""
    try:
        # Подключение к PostgreSQL
        conn = psycopg2.connect(**DB_CONFIG)
        conn.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT)
        cursor = conn.cursor()
        
        # Проверка существования базы данных
        cursor.execute("SELECT 1 FROM pg_catalog.pg_database WHERE datname = %s", (DB_NAME,))
        if not cursor.fetchone():
            cursor.execute(f"CREATE DATABASE {DB_NAME}")
            print(f"База данных {DB_NAME} создана успешно")
        else:
            print(f"База данных {DB_NAME} уже существует")
        
        # Проверка существования пользователя
        cursor.execute("SELECT 1 FROM pg_roles WHERE rolname = %s", (DB_USER,))
        if not cursor.fetchone():
            cursor.execute(f"CREATE USER {DB_USER} WITH PASSWORD '{DB_PASSWORD}'")
            print(f"Пользователь {DB_USER} создан успешно")
        else:
            print(f"Пользователь {DB_USER} уже существует")
        
        # Предоставление полных прав пользователю
        cursor.execute(f"GRANT ALL PRIVILEGES ON DATABASE {DB_NAME} TO {DB_USER}")
        cursor.execute(f"ALTER USER {DB_USER} CREATEDB")
        print(f"Права предоставлены пользователю {DB_USER}")
        
        cursor.close()
        conn.close()
        
    except psycopg2.Error as e:
        print(f"Ошибка при создании базы данных: {e}")

def create_tables():
    """Создание таблиц в базе данных"""
    try:
        # Подключение к базе данных от имени администратора
        conn = psycopg2.connect(
            host='127.0.0.1',
            database=DB_NAME,
            user=DB_CONFIG['user'],  # Используем админа для создания таблиц
            password=DB_CONFIG['password']
        )
        cursor = conn.cursor()
        
        # Создание таблицы products
        cursor.execute("""
            CREATE TABLE IF NOT EXISTS products (
                id SERIAL PRIMARY KEY,
                title VARCHAR(500) NOT NULL,
                ai_description TEXT,
                original_description TEXT,
                price DECIMAL(10, 2) NOT NULL,
                original_price DECIMAL(10, 2),
                main_image VARCHAR(1000),
                category VARCHAR(100),
                epn_link VARCHAR(1000),
                aliexpress_link VARCHAR(1000) NOT NULL,
                rating DECIMAL(3, 2) DEFAULT 0,
                orders_count INTEGER DEFAULT 0,
                external_product_id VARCHAR(100),
                status VARCHAR(20) DEFAULT 'active',
                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
            )
        """)
        print("Таблица products создана")
        
        # Создание таблицы analytics
        cursor.execute("""
            CREATE TABLE IF NOT EXISTS analytics (
                id SERIAL PRIMARY KEY,
                product_id INTEGER REFERENCES products(id),
                clicks INTEGER DEFAULT 0,
                source VARCHAR(50) DEFAULT 'website',
                date DATE DEFAULT CURRENT_DATE,
                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
            )
        """)
        print("Таблица analytics создана")
        
        # Создание индексов
        cursor.execute("CREATE INDEX IF NOT EXISTS idx_products_status ON products(status)")
        cursor.execute("CREATE INDEX IF NOT EXISTS idx_products_category ON products(category)")
        cursor.execute("CREATE INDEX IF NOT EXISTS idx_products_created_at ON products(created_at)")
        cursor.execute("CREATE INDEX IF NOT EXISTS idx_products_external_id ON products(external_product_id)")
        cursor.execute("CREATE INDEX IF NOT EXISTS idx_analytics_product_date ON analytics(product_id, date)")
        print("Индексы созданы")
        
        # Предоставление прав пользователю на таблицы
        cursor.execute(f"GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO {DB_USER}")
        cursor.execute(f"GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO {DB_USER}")
        cursor.execute(f"ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO {DB_USER}")
        cursor.execute(f"ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO {DB_USER}")
        print(f"Права на таблицы предоставлены пользователю {DB_USER}")
        
        conn.commit()
        cursor.close()
        conn.close()
        
        print("Таблицы созданы успешно")
        
    except psycopg2.Error as e:
        print(f"Ошибка при создании таблиц: {e}")

def test_connection():
    """Тестирование подключения пользователя к базе данных"""
    try:
        conn = psycopg2.connect(
            host='127.0.0.1',
            database=DB_NAME,
            user=DB_USER,
            password=DB_PASSWORD
        )
        cursor = conn.cursor()
        
        # Тест SELECT
        cursor.execute("SELECT COUNT(*) FROM products")
        count = cursor.fetchone()[0]
        print(f"Тест подключения успешен. Товаров в базе: {count}")
        
        cursor.close()
        conn.close()
        
    except psycopg2.Error as e:
        print(f"Ошибка при тестировании подключения: {e}")

if __name__ == '__main__':
    print("=== Настройка базы данных ===")
    create_database()
    print("\n=== Создание таблиц ===")
    create_tables()
    print("\n=== Тестирование подключения ===")
    test_connection()
