import enum
import typing

from composer_hr.engine.abstract import AbstractEnum

ENUMERATION_CLASSES: typing.List[enum.Enum ] = list()


class MainInformant(AbstractEnum):
    '''As informações foram fornecidas {}.'''
    PATIENT_ONLY = ('pelo paciente apenas', 'fonte: paciente;\n\n', 'Todas as informações deste registro foram concedidas pelo próprio paciente.')
    PATIENT_AND_RELATIVE = ('pelo paciente e acompanhante (familiar)', '', 'As informações deste registro foram concedidas pelo próprio paciente acompanhado por familiar.')
    RELATIVE_ONLY = ('por familiar apenas', '', 'As informações deste registro foram concedidas apenas por familiar do paciente.')
    PATIENT_AND_OTHER = ('pelo paciente e acompanhante (terceiro)', '', 'As informações deste registro foram concedidas pelo próprio paciente acompanhado por familiar.')
    OTHER_ONLY = ('por responsável (não familiar)', '', 'As informações deste registro foram concedidas por acompanhante responsável pelo paciente.' )


ENUMERATION_CLASSES.append(MainInformant)

class Reason(AbstractEnum):
    START_TREATMENT = ('iniciar tratamento', 'com finalidade de iniciar tratamento', 'O motivo principal da entrevista é iniciar tratamento.')
    REVISION = ('revisão de tratamento', 'com finalidade de revisão de caso', 'A entrevista atual tem como finalidade revisão de tratamento.')
    DOCUMENTATION = ('documentação do caso clínico', 'com finalidade de documentação de caso', 'A entrevista atual tem como finalidade registro e documentação de caso clínico.')


ENUMERATION_CLASSES.append(Reason)


class VisitType(AbstractEnum):
    FIRST_VISIT = ('Visita Inicial', '', 'Visita Inicial.')


ENUMERATION_CLASSES.append(VisitType)


class Start(AbstractEnum):
    ACUTE = ('agudo', 'apresentação inicial aguda', 'A apresentação inicial do episódio foi aguda.')
    SUBACUTE = ('subagudo', 'de apresentação inicial subaguda', 'A apresentação inicial do episódio foi subaguda.')
    INSIDIOUS = ('insidioso', 'de apresentação inicial insidiosa', 'O quadro teve início de forma insidiosa, com piora progressiva ao longo do tempo.')
    INTERMITTENT = ('intermitente', 'de apresentação inicial intermitente', 'Os sintomas iniciaram de forma intermitente, com crises intercaladas com períodos de melhora.')


ENUMERATION_CLASSES.append(Start)


class Evolution(AbstractEnum):
    RECURRENT = ('recorrente', 'de evolução recorrente (remissão e recorrência)', 'A evolução foi recorrente, com períodos de remissão intercrise.')
    REMITTED = ('remissão', 'evoluindo para remissão', 'Após a apresentação inicial o quadro evoluiu para remissão dos sintomas.')
    PERSISTENT = ('persistente', 'evoluindo com persistência do quadro', 'O quadro evoluiu de maneira persistente, sem melhora dos sintomas desde a apresentação inicial.')
    OSCILLATING = ('oscilante', 'evoluindo de sintomas oscilantes', 'De evolução oscilante, descreve persistência das queixas mais ou menos intensas ao longo do tempo.')


ENUMERATION_CLASSES.append(Evolution)


class EpisodeDuration(AbstractEnum):
    MINUTES = ('minutos', 'duração de minutos', 'Um episódio tem duração de alguns minutos.')
    HOURS = ('horas', 'duração de horas', 'O episódio teve duração de horas.')
    DAYS = ('dias', 'duração de dias', 'Um episódio tem duração de dias.')
    WEEKS = ('semanas', 'duração de semanas', 'Um episódio tem duração de semanas.')
    MONTHS = ('meses', 'duração de meses', 'Um episódio tem duração de meses.')
    YEARS = ('anos', 'duração de anos', 'Um episódio tem duração de anos.')


ENUMERATION_CLASSES.append(EpisodeDuration)


class CurrentTherapy(AbstractEnum):
    REGULAR = ('regulra', '', 'Refere suporte psicoterápico regular e estável.')
    NOT_REGULAR = ('irregular', '', 'Não segue a psicoterapia de forma regular.')
    REFUSE = ('recusa', '', 'Recusa qualquer tipo de acompanhamento psicológico.')


ENUMERATION_CLASSES.append(CurrentTherapy)


class CurrentState(AbstractEnum):
    SEVERE = ('severa', 'de evolução recorrente (remissão e recorrência)', 'A evolução foi recorrente, com períodos de remissão intercrise.')
    MODERATE = ('moderada', 'evoluindo para remissão', 'Após a apresentação inicial o quadro evoluiu para remissão dos sintomas.')
    MILD = ('leve', 'evoluindo com persistência do quadro', 'O quadro evoluiu de maneira persistente, sem melhora dos sintomas desde a apresentação inicial.')
    ABSENT = ('ausente', 'evoluindo de sintomas oscilantes', 'A evolução foi oscilante, com períodos de melhora parcial e outros mais intensos.')


ENUMERATION_CLASSES.append(CurrentState)


class PharmacotherapyEfficacy(AbstractEnum):
    '''O tratamento é considerado {} para controle da apresentação clínica.'''
    EFFECTIVE = ('eficaz', '', 'A medicação é eficaz.')
    MODERATE_EFFICACY = ('parcialmente eficaz', '', 'A medicação é moderadamente eficaz')
    MILD_EFFICACY = ('pouco eficaz', '', 'A medicação é pouco eficaz')
    INEFFECTIVE = ('ineficaz', '', 'A medicação é ineficaz')


ENUMERATION_CLASSES.append(PharmacotherapyEfficacy)


class PharmacotherapyTolerability(AbstractEnum):
    '''Quando a eventos adversos reporta que a medicação é de forma geral {}.'''
    TOLERABLE = ('bem tolerada', '', 'A tolerância farmacológica é excelente, sem queixa quanto a eventos adversos.')
    MODERATE_TOLERABILITY = ('parcialmente tolerada', '', 'Apresenta alguns efeitos colarais mas no geral tolera bem a farmacoterapia.')
    MILD_TOLERABILITY = ('pouco tolerada', '', 'Apresenta eventos adversos que dificultam o tratamento farmacológico.')
    NOT_TOLERABLE = ('não tolerada', '', 'Reporta não tolerar a medicação, sendo a descontinuação necessária.')


ENUMERATION_CLASSES.append(PharmacotherapyTolerability)


class PharmacotherapyAffordability(AbstractEnum):
    '''A medicação é {} do ponto de vista financeiro.'''
    AFFORDABLE = ('acessível', '', 'O tratamento farmacológico é acessível para o paciente.')
    MODERATE_AFFORDABILITY = ('parcialmente acessível', '', 'O tratamento farmacológico é parcialmente acessível para o paciente.')
    MILD_AFFORDABILITY = ('pouco acessível', '', 'O tratamento farmacológico é pouco acessível para o paciente.')
    UNAFFORDABLE = ('inacessível', '', 'O tratamento farmacológico atual é inacessível para o paciente.')


ENUMERATION_CLASSES.append(PharmacotherapyAffordability)


class ReportType(AbstractEnum):
    '''Documento do tipo {}.'''
    MEDICAL_REPORT = ('Relatório Médico', '', 'Relatório médico')
    MEDICAL_LICENCE = ('Licença Médica', '', 'Atestado Médico')
    TREATMENT_ATTENDANCE = ('Atestado de Comparecimento', '', 'Atestado de Comparecimento')


ENUMERATION_CLASSES.append(ReportType)


class CurrentIncapacity(AbstractEnum):
    '''A incapacidade atual é do tipo {}.'''
    TOTAL_PERMANENT = ('permanente e total', '', 'A incapacidade atual é considerada total e permanente.')
    TOTAL_TEMPORARY = ('temporária porém total', '', 'A incapacidade atual é considerada total porém temporária, com expectativa de recuperação.')
    PARTIAL_PERMANENT = ('parcial porém permanente', '', 'A incapacidade atual é considerada parcial porém permanente.')
    PARTIAL_TEMPORARY = ('parcial e temporária', '', 'A incapacidade atual é parcial e temporária, com expectativa de recuperação funcional.')


ENUMERATION_CLASSES.append(CurrentIncapacity)


class MedicationAdherence(AbstractEnum):
    FULL_ADHERENCE = ('total', '', 'A aderência à prescrição é total.')
    GOOD_ADHERENCE = ('boa', '', 'A aderência ao tratamento é boa, com falhas ocasionais.')
    PARTIAL_ADHERENCE = ('parcial', '', 'Faz uso parcial das medicações recomendadas, aproximadamente metade do prescrito.')
    POOR_ADHERENCE = ('ruim', '', 'A aderência à prescrição é muito reduzida.')
    NO_ADHERENCE= ('ausente', '', 'Não faz uso da prescrição recomendada.')


ENUMERATION_CLASSES.append(MedicationAdherence)


class ClinicalStability(AbstractEnum):
    STABLE = ('estável', '', 'O quadro atual é considerado estável.')
    UNSTABLE = ('instável', '', 'O quadro atual sugere apresentação instável.')


ENUMERATION_CLASSES.append(ClinicalStability)


class DiseaseActivity(AbstractEnum):
    ACTIVE = ('ativa', '', 'Apresentação clínica atual com sintomas presentes e indicativo de doença ativa.')
    INTERMITTENT = ('intermitente', '', 'Apresentação atual do tipo intermitente, com períodos de sintomas intercalados com fases de normalidade.')
    RESIDUAL = ('residual', '', 'Apresentação atual do tipo residual, com controle de fase aguda persistindo sintomas residuais.')
    ABSENT = ('ausente', '', 'Ausência de transtorno/doença de acordo com a apresentação atual.')


