"""
A Styles is a collection of PropertySets that can be applied to a particular RTF element.

At present there are only two, Text and Paragraph but ListStyles will be added soon too.


"""
from __future__ import absolute_import

from builtins import object
from .PropertySets import *

class TextStyle(object) :
	def __init__( self, text_props, name=None, shading_props=None ) :
		self.SetTextPropertySet   ( text_props    )
		self.SetName              ( name          )
		self.SetShadingPropertySet( shading_props )

	def Copy( self ) :
		return deepcopy( self )

	def SetName( self, value ) :
		self.Name = value
		return self

	def SetTextPropertySet( self, value ) :
		assert isinstance( value, TextPropertySet )
		self.TextPropertySet = value
		return self

	def SetShadingPropertySet( self, value ) :
		assert value is None or isinstance( value, ShadingPropertySet )
		self.ShadingPropertySet = value or ShadingPropertySet()
		return self

class ParagraphStyle(object) :
	def __init__( self, name, text_style, paragraph_props=None, frame_props=None, shading_props=None ) :

		#	A style must have Font and a Font Size but the Text property set doesn't
		#	make these mandatory so that they can be used for overrides so at this point
		#	we need to make sure that that we have these values set
		if not text_style.TextPropertySet.Font : raise Exception( 'Paragraph Styles must have a Font specified.'      )
		if not text_style.TextPropertySet.Size : raise Exception( 'Paragraph Styles must have a Font Size specified.' )

		self.SetName                ( name            )
		self.SetTextStyle           ( text_style      )
		self.SetParagraphPropertySet( paragraph_props )
		self.SetFramePropertySet    ( frame_props     )
		self.SetShadingPropertySet  ( shading_props   )

		self.SetBasedOn( None )
		self.SetNext   ( None )

	def Copy( self ) :
		return deepcopy( self )

	def SetName( self, value ) :
		self.Name = value
		return self

	def SetTextStyle( self, value ) :
		assert isinstance( value, TextStyle )
		self.TextStyle = value
		return self

	def SetParagraphPropertySet( self, value ) :
		assert value is None or isinstance( value, ParagraphPropertySet )
		self.ParagraphPropertySet = value or ParagraphPropertySet()
		return self

	def SetFramePropertySet( self, value ) :
		assert value is None or isinstance( value, FramePropertySet )
		self.FramePropertySet = value or FramePropertySet()
		return self

	def SetShadingPropertySet( self, value ) :
		"""Set the background shading for the paragraph."""
		
		assert value is None or isinstance( value, ShadingPropertySet )
		self.ShadingPropertySet = value or ShadingPropertySet()
		return self

	def SetBasedOn( self, value ) :
		"""Set the Paragraph Style that this one is based on."""
		
		assert not value or isinstance( value, ParagraphStyle )
		self.BasedOn = value
		return self

	def SetNext( self, value ) :
		"""Set the Paragraph Style that should follow this one."""

		assert not value or isinstance( value, ParagraphStyle )
		self.Next    = value
		return self
