IF OBJECT_ID('[dbo].[TaxRate]') IS NULL
BEGIN
    CREATE TABLE [dbo].[TaxRate] (
        [Id]                VARCHAR(40)         NOT NULL,
        [Country]           VARCHAR(50)         NOT NULL,
        [State]             VARCHAR(2)          NULL,
        [PostalCode]        VARCHAR(10)         NOT NULL,
        [Rate]              DECIMAL(5,2)        NOT NULL,
        [Active]            BIT                 NOT NULL,
        CONSTRAINT [PK_TaxRate] PRIMARY KEY CLUSTERED ([Id] ASC)
    );

    CREATE UNIQUE INDEX [IX_TaxRate_Country_PostalCode_Active_Uniqueness]
    ON [dbo].[TaxRate](Country, PostalCode)
    WHERE Active = 1;
END
GO

IF OBJECT_ID('[dbo].[TaxRate_ReadById]') IS NOT NULL
BEGIN
    DROP PROCEDURE [dbo].[TaxRate_ReadById]
END
GO

CREATE PROCEDURE [dbo].[TaxRate_ReadById]
    @Id VARCHAR(40)
AS
BEGIN
    SET NOCOUNT ON 

    SELECT * FROM [dbo].[TaxRate]
    WHERE Id = @Id
END
GO

IF OBJECT_ID('[dbo].[TaxRate_Search]') IS NOT NULL
BEGIN
    DROP PROCEDURE [dbo].[TaxRate_Search]
END
GO

CREATE PROCEDURE [dbo].[TaxRate_Search]
    @Skip INT = 0,
    @Count INT = 25
AS
BEGIN
    SET NOCOUNT ON 
    
    SELECT * FROM [dbo].[TaxRate]
    WHERE Active = 1
    ORDER BY Country, PostalCode DESC
    OFFSET @Skip ROWS
    FETCH NEXT @Count ROWS ONLY
END
GO

IF OBJECT_ID('[dbo].[TaxRate_ReadAllActive]') IS NOT NULL
BEGIN
    DROP PROCEDURE [dbo].[TaxRate_ReadAllActive]
END
GO

CREATE PROCEDURE [dbo].[TaxRate_ReadAllActive]
AS
BEGIN
    SET NOCOUNT ON 
    
    SELECT * FROM [dbo].[TaxRate]
    WHERE Active = 1
END
GO

IF OBJECT_ID('[dbo].[TaxRate_ReadByLocation]') IS NOT NULL
BEGIN
    DROP PROCEDURE [dbo].[TaxRate_ReadByLocation]
END
GO

CREATE PROCEDURE [dbo].[TaxRate_ReadByLocation]
    @Country VARCHAR(50),
    @PostalCode VARCHAR(10)
AS
BEGIN
    SET NOCOUNT ON 
    
    SELECT * FROM [dbo].[TaxRate]
    WHERE Active = 1
        AND [Country] = @Country
        AND [PostalCode] = @PostalCode
END
GO

IF OBJECT_ID('[dbo].[TaxRate_Create]') IS NOT NULL
BEGIN
    DROP PROCEDURE [dbo].[TaxRate_Create]
END
GO

CREATE PROCEDURE [dbo].[TaxRate_Create]
    @Id VARCHAR(40),
    @Country VARCHAR(50),
    @State VARCHAR(2),
    @PostalCode VARCHAR(10),
    @Rate DECIMAL(5,2),
    @Active BIT
AS
BEGIN
    SET NOCOUNT ON

    INSERT INTO [dbo].[TaxRate]
    (
        [Id],
        [Country],
        [State],
        [PostalCode],
        [Rate],
        [Active]
    )
    VALUES
    (
        @Id,
        @Country,
        @State,
        @PostalCode,
        @Rate,
        1
    )
END
GO

IF OBJECT_ID('[dbo].[TaxRate_Archive]') IS NOT NULL
BEGIN
    DROP PROCEDURE [dbo].[TaxRate_Archive]
END
GO

CREATE PROCEDURE [dbo].[TaxRate_Archive]
    @Id VARCHAR(40)
AS
BEGIN
    SET NOCOUNT ON

    UPDATE
        [dbo].[TaxRate]
    SET
        [Active] = 0
    WHERE
        [Id] = @Id
END