"""
DAG для демонстрации работы с SQL в Airflow
Уровень: Начальный-Средний
"""
from datetime import datetime, timedelta
from airflow import DAG
from airflow.operators.python import PythonOperator
from airflow.providers.postgres.operators.postgres import PostgresOperator

# Определение DAG
default_args = {
    'owner': 'student',
    'depends_on_past': False,
    'start_date': datetime(2023, 1, 1),
    'email_on_failure': False,
    'email_on_retry': False,
    'retries': 1,
    'retry_delay': timedelta(minutes=5)
}

dag = DAG(
    'sql_basic_dag',
    default_args=default_args,
    description='DAG для изучения SQL операций в Airflow',
    schedule_interval=None,
    catchup=False,
    tags=['educational', 'sql', 'beginner']
)

# SQL команды
create_table_sql = """
CREATE TABLE IF NOT EXISTS students_sample (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    age INTEGER,
    created_at TIMESTAMP DEFAULT NOW()
);
"""

insert_data_sql = """
INSERT INTO students_sample (name, age) VALUES 
('Alice', 22),
('Bob', 24),
('Charlie', 21)
ON CONFLICT DO NOTHING;
"""

query_data_sql = """
SELECT * FROM students_sample;
"""

truncate_table_sql = """
TRUNCATE TABLE students_sample;
"""

# Определение задач
create_table_task = PostgresOperator(
    task_id='create_table',
    postgres_conn_id='postgres_training',  # Это соединение нужно будет создать вручную в Airflow UI
    sql=create_table_sql,
    dag=dag
)

insert_data_task = PostgresOperator(
    task_id='insert_data',
    postgres_conn_id='postgres_training',
    sql=insert_data_sql,
    dag=dag
)

query_data_task = PostgresOperator(
    task_id='query_data',
    postgres_conn_id='postgres_training',
    sql=query_data_sql,
    dag=dag
)

truncate_table_task = PostgresOperator(
    task_id='drop_table',
    postgres_conn_id='postgres_training',
    sql=truncate_table_sql,
    dag=dag
)

# Установка зависимостей
create_table_task >> insert_data_task >> query_data_task >> truncate_table_task
