#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#

"""
API Models module
"""

from datetime import date
from django.db import models


class Dataset(models.Model):
    name = models.CharField(max_length=128, unique=True)
    region = models.CharField(max_length=128, unique=True)


class Algorithm(models.Model):
    '''
    The MLAlgorithm represent the ML algorithm object.

    Attributes
    ----------
        classifier: The name of the algorithm.
        description: The short description of how the algorithm works.
        code: The code of the algorithm.
        version: The version of the algorithm similar to software versioning.
        status: The status of algorithm in the endpoint. Can be: testing, staging, production, ab_testing.
        created_by: The name of the owner.
        created_at: The date when MLAlgorithm was added.
    '''
    classifier: str = models.CharField(max_length=128)
    description: str = models.TextField(blank=True, null=True)
    version: str = models.CharField(max_length=128)
    status: str = models.CharField(max_length=128)
    dataset: Dataset = models.ForeignKey(Dataset,
                                         to_field="name",
                                         null=True,
                                         on_delete=models.SET_NULL)
    created_at: date = models.DateTimeField(auto_now_add=True, blank=True)
    created_by: str = models.CharField(max_length=128)

    def __str__(self):
        return f"""
                ML Algorithm
                Classifier: {self.classifier}
                Description: {self.description}
                Version: {self.version}
                Status: {self.status}
                Created By: {self.created_by}
                Created At: {self.created_at}
                """

    class Meta:
        ordering = ['created_at']


class PredictionRequest(models.Model):
    '''
    The MLRequest will keep information about all requests to ML algorithms.

    Attributes
    ----------
        input: The input data to ML algorithm in JSON format.
        response: The full response of the ML algorithm in JSON format.
        prediction: The the prediction from ML request.
        feedback: The feedback about the response in JSON format.
        created_by: The name of creator.
        created_at: The date when request was created.
        algorithm: The reference to MLAlgorithm used to compute response.
    '''
    input = models.JSONField()
    response = models.JSONField()
    prediction = models.CharField(max_length=128)
    feedback = models.CharField(max_length=128, blank=True, null=True)
    notes = models.TextField(blank=True, null=True)
    algorithm: Algorithm = models.ForeignKey(Algorithm,
                                             on_delete=models.DO_NOTHING,
                                             blank=True, null=True)
    created_at: date = models.DateTimeField(auto_now_add=True, blank=True)
    created_by = models.CharField(max_length=128)

    def __str__(self):
        return f"""
                ML Request
                Input Data: {self.input_data}
                Response: {self.response}
                Feedback: {self.feedback}
                Algorithm: {self.algorithm}
                Created By: {self.created_by}
                Created At: {self.created_at}
                """

    class Meta:
        ordering = ['created_at']
