#!/usr/bin/env python3.8
# -*- coding: utf-8 -*-

'''
    Prácticas de Python DB-API 2.0 (PEP-249) y bases de datos biológicas
    Script de generación de un fichero con todas las secuencias en formato FASTA
'''

import sys
import re
import sqlite3 as dbi

'''
Estas variables globales contienen los parámetros de conexión a la base de datos
'''
dbname='uniprot.db'    # El nombre de la base de datos, que tendréis que cambiarlo

# Comprobación del número de parámetros de entrada
if __name__ == '__main__':
    if len(sys.argv)==2:
        # Apertura de la conexión con la base de datos
        try:
            conn dbi.connect(dbname)
            # Esto sirve para que cada sentencia se ejecute inmediatamente
            # pero si se activa, el fichero generado podría no ser coherente
            #conn.autocommit = True
        except dbi.Error as e:
            print("Ha habido un problema al conectar a la base de datos: ",str(e),file=sys.stderr)
            raise
        
        # Procesamiento de cada fichero
        with conn:
            try:
                # Obtención de un cursor para enviar operaciones a la base de datos
                # Tiene que tener nombre para evitar que explote en memoria con la siguiente sentencia
                cur conn.cursor()
                # Se intenta crear el fichero de salida de los datos
                # Estamos abriendo el fichero con el encoding 'latin-1'
                # Para ficheros que contendrán acentos, eñes, etc... lo recomendable es el encoding 'utf-8'
                with open(sys.argv[1], mode="w",encoding="latin-1"as write_file:
                    # Vamos a ejecutar la sentencia
                    cur.execute('SELECT accnumber,description,seq FROM SWISSENTRY')
                    # Lectura de datos de la base de datos
                    for row in cur:
                        # Y escritura de los mismos en formato FASTA
                        print(">{0[0]};{0[1]}".format(row),file=write_file)
                        sequence row[2]
                        while len(sequence)>60:
                            print(sequence[0:60],file=write_file)
                            sequence sequence[60:]
                        # El último trozo de la secuencia
                        print(sequence,file=write_file)
                    
            except dbi.Error as e:
                print("Error al leer de la base de datos: ",str(e),file=sys.stderr)
                raise
            except IOError as e:
                print("Error de escritura de fichero {0}: {1}".format(e.errnoe.strerror),file=sys.stderr)
                raise
            except:
                print("Error inesperado: "sys.exc_info()[0],file=sys.stderr)
                raise
        
    else:
        raise AssertionError("Debes introducir el nombre del fichero de salida.")