import common
from autotest_lib.database import db_utils

UP_SQL = """
CREATE INDEX afe_drone_sets_drones_droneset_ibfk
ON afe_drone_sets_drones (droneset_id);

ALTER TABLE afe_drone_sets_drones
DROP KEY afe_drone_sets_drones_unique;

ALTER TABLE afe_drone_sets_drones
ADD CONSTRAINT afe_drone_sets_drones_unique
UNIQUE KEY (drone_id);
"""

# On first migration to 62, this key will be deleted automatically. However, if
# you migrate to 62, then down to 61, then back to 62, this key will remain.
DROP_KEY_SQL = """
ALTER TABLE afe_drone_sets_drones
DROP KEY afe_drone_sets_drones_drone_ibfk;
"""

DOWN_SQL = """
CREATE INDEX afe_drone_sets_drones_drone_ibfk
ON afe_drone_sets_drones (drone_id);

ALTER TABLE afe_drone_sets_drones
DROP KEY afe_drone_sets_drones_unique;

ALTER TABLE afe_drone_sets_drones
ADD CONSTRAINT afe_drone_sets_drones_unique
UNIQUE KEY (droneset_id, drone_id);

ALTER TABLE afe_drone_sets_drones
DROP KEY afe_drone_sets_drones_droneset_ibfk;
"""


def migrate_up(manager):
    query = ('SELECT * FROM afe_drone_sets_drones '
             'GROUP BY drone_id HAVING COUNT(*) > 1')
    rows = manager.execute(query)
    if rows:
        raise Exception('Some drones are associated with more than one drone '
                        'set. Please remove all duplicates before running this '
                        'migration.')
    manager.execute_script(UP_SQL)

    if db_utils.check_index_exists(manager, 'afe_drone_sets_drones',
                                   'afe_drone_sets_drones_drone_ibfk'):
        manager.execute(DROP_KEY_SQL)