import os
import tempfile
import unittest
from django.conf import settings
from django.core.files.base import ContentFile
from django.db import models
from django.test import TestCase

from imagekit import processors
from imagekit.models import ImageModel
from imagekit.specs import ImageSpec
from imagekit.lib import Image


class ResizeToWidth(processors.Resize):
    width = 100
    
class ResizeToHeight(processors.Resize):
    height = 100
    
class ResizeToFit(processors.Resize):
    width = 100
    height = 100
    
class ResizeCropped(ResizeToFit):
    crop = ('center', 'center')

class TestResizeToWidth(ImageSpec):
    access_as = 'to_width'
    processors = [ResizeToWidth]

class TestResizeToHeight(ImageSpec):
    access_as = 'to_height'
    processors = [ResizeToHeight]
    
class TestResizeCropped(ImageSpec):
    access_as = 'cropped'
    processors = [ResizeCropped]

class TestPhoto(ImageModel):
    """ Minimal ImageModel class for testing """
    image = models.ImageField(upload_to='images')
    
    class IKOptions:
        spec_module = 'imagekit.tests'
    

class IKTest(TestCase):
    """ Base TestCase class """
    def setUp(self):
        # create a test image using tempfile and PIL
        self.tmp = tempfile.TemporaryFile()
        Image.new('RGB', (800, 600)).save(self.tmp, 'JPEG')
        self.tmp.seek(0)
        self.p = TestPhoto()
        self.p.image.save(os.path.basename('test.jpg'),
                           ContentFile(self.tmp.read()))
        self.p.save()
        # destroy temp file
        self.tmp.close()
        
    def test_setup(self):
        self.assertEqual(self.p.image.width, 800)
        self.assertEqual(self.p.image.height, 600)
        
    def test_to_width(self):
        self.assertEqual(self.p.to_width.width, 100)
        self.assertEqual(self.p.to_width.height, 75)
        
    def test_to_height(self):
        self.assertEqual(self.p.to_height.width, 133)
        self.assertEqual(self.p.to_height.height, 100)
        
    def test_crop(self):
        self.assertEqual(self.p.cropped.width, 100)
        self.assertEqual(self.p.cropped.height, 100)

    def test_url(self):
        tup = (settings.MEDIA_URL, self.p._ik.cache_dir, 'test_to_width.jpg')
        self.assertEqual(self.p.to_width.url, "%s%s/%s" % tup)
 
    def tearDown(self):
        # make sure image file is deleted
        path = self.p.image.path
        self.p.delete()
        self.failIf(os.path.isfile(path))