{
    "openapi": "3.0.0",
    "info": {
        "title": "Gaga API",
        "description": "API Documentation for Gaga Delivery Platform",
        "version": "1.0.0"
    },
    "servers": [
        {
            "url": "http://127.0.0.1:8000",
            "description": "Local Server"
        }
    ],
    "paths": {
        "/v1/auth/customer/send-otp": {
            "post": {
                "tags": [
                    "Customer Auth"
                ],
                "summary": "Send OTP to customer via WhatsApp",
                "description": "Send OTP to customer via WhatsApp.",
                "operationId": "c01f556e46ca5622a26eab9b89452411",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "phone_number"
                                ],
                                "properties": {
                                    "phone_number": {
                                        "type": "string",
                                        "example": "0612345678"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "202": {
                        "description": "OTP sent successfully",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "properties": {
                                        "message": {
                                            "type": "string",
                                            "example": "OTP sent successfully"
                                        }
                                    },
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Validation error"
                    },
                    "500": {
                        "description": "Failed to send OTP"
                    }
                }
            }
        },
        "/v1/auth/customer/verify-otp": {
            "post": {
                "tags": [
                    "Customer Auth"
                ],
                "summary": "Verify OTP and authenticate user",
                "description": "Verify OTP and check user existence.",
                "operationId": "0b35fcdcd415ff4991dda4ee39ffbf5f",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "phone_number",
                                    "verification_code"
                                ],
                                "properties": {
                                    "phone_number": {
                                        "type": "string",
                                        "example": "0612345678"
                                    },
                                    "verification_code": {
                                        "type": "string",
                                        "example": "1234"
                                    },
                                    "device_id": {
                                        "type": "string"
                                    },
                                    "fcm_token": {
                                        "type": "string"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Authentication successful"
                    },
                    "400": {
                        "description": "Invalid or expired OTP"
                    },
                    "429": {
                        "description": "Too many attempts"
                    }
                }
            }
        },
        "/v1/auth/customer/complete-profile": {
            "post": {
                "tags": [
                    "Customer Auth"
                ],
                "summary": "Complete user profile after OTP verification",
                "description": "Complete user profile creation after OTP verification.",
                "operationId": "7d848624d71299a12eda9d2c348ec866",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "phone_number",
                                    "first_name",
                                    "last_name"
                                ],
                                "properties": {
                                    "phone_number": {
                                        "type": "string"
                                    },
                                    "first_name": {
                                        "type": "string"
                                    },
                                    "last_name": {
                                        "type": "string"
                                    },
                                    "device_id": {
                                        "type": "string"
                                    },
                                    "fcm_token": {
                                        "type": "string"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Registration successful"
                    },
                    "409": {
                        "description": "User already exists"
                    },
                    "403": {
                        "description": "Phone not verified"
                    }
                }
            }
        },
        "/v1/auth/customer/me": {
            "get": {
                "tags": [
                    "Customer Auth"
                ],
                "summary": "Get authenticated user info",
                "description": "Get authenticated user info.",
                "operationId": "0fa73b8f008b65103c27588ef1a7d425",
                "responses": {
                    "200": {
                        "description": "User info returned"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v1/auth/customer/logout": {
            "post": {
                "tags": [
                    "Customer Auth"
                ],
                "summary": "Logout user",
                "description": "Logout user (revoke token).",
                "operationId": "7d29acf1b77cb0a950af36b330ede970",
                "responses": {
                    "200": {
                        "description": "Logged out successfully"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/v1/store/categories": {
            "get": {
                "tags": [
                    "Store Categories"
                ],
                "summary": "List categories",
                "operationId": "c508885ba64d281e9c1ad34ebed19ecc",
                "responses": {
                    "200": {
                        "description": "Categories retrieved successfully"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "post": {
                "tags": [
                    "Store Categories"
                ],
                "summary": "Create category",
                "operationId": "5367a1430ea025b9f2f7a91fbd1fd37d",
                "responses": {
                    "201": {
                        "description": "Category created"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/v1/store/categories/{id}": {
            "get": {
                "tags": [
                    "Store Categories"
                ],
                "summary": "Show category",
                "operationId": "07a6d8aec28b5a26356cda96694b1cb5",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Category found"
                    },
                    "404": {
                        "description": "Category not found"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "put": {
                "tags": [
                    "Store Categories"
                ],
                "summary": "Update category",
                "operationId": "fdcccac2f20492126b9eb5dfb5a11cd0",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Category updated"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "delete": {
                "tags": [
                    "Store Categories"
                ],
                "summary": "Delete category",
                "operationId": "d285358db0d2d605f5a92c30a688e2b7",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Category deleted"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/store/categories": {
            "get": {
                "tags": [
                    "Store Categories"
                ],
                "summary": "Get categories by store",
                "operationId": "08a8cd54d6d2134e90a7cd9f5fbabed7",
                "responses": {
                    "200": {
                        "description": "Success"
                    }
                }
            }
        },
        "/api/v1/store/menu-categories": {
            "get": {
                "tags": [
                    "Menu Categories"
                ],
                "summary": "List menu categories",
                "operationId": "ef0573ca6ff9c0c0f219dcda4bed3eaa",
                "responses": {
                    "200": {
                        "description": "Menu categories retrieved successfully"
                    }
                }
            },
            "post": {
                "tags": [
                    "Menu Categories"
                ],
                "summary": "Create menu category",
                "operationId": "c3ed63aa079569133b83beb97a5e3fc1",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "name"
                                ],
                                "properties": {
                                    "name": {
                                        "type": "string",
                                        "example": "Entrées"
                                    },
                                    "menu_id": {
                                        "type": "integer",
                                        "example": 1
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Menu category created"
                    },
                    "422": {
                        "description": "Validation error"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/v1/store/menu-categories/{id}": {
            "get": {
                "tags": [
                    "Menu Categories"
                ],
                "summary": "Show menu category",
                "operationId": "88191c1d2cf090a8a32cfba6aff173aa",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Menu category found"
                    },
                    "404": {
                        "description": "Menu category not found"
                    }
                }
            },
            "put": {
                "tags": [
                    "Menu Categories"
                ],
                "summary": "Update menu category",
                "operationId": "35de4821a5a5c599ee818d5725a53ced",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "properties": {
                                    "name": {
                                        "type": "string",
                                        "example": "Plats principaux"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Menu category updated"
                    },
                    "404": {
                        "description": "Menu category not found"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "delete": {
                "tags": [
                    "Menu Categories"
                ],
                "summary": "Delete menu category",
                "operationId": "2db38d4786d754e5e2c1d13551701f73",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Menu category deleted"
                    },
                    "404": {
                        "description": "Menu category not found"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/v1/store/menus": {
            "get": {
                "tags": [
                    "Menus"
                ],
                "summary": "List menus",
                "operationId": "5c3e718424179f1d5139179ccbc6d8e9",
                "responses": {
                    "200": {
                        "description": "Menus retrieved successfully"
                    }
                }
            },
            "post": {
                "tags": [
                    "Menus"
                ],
                "summary": "Create menu",
                "operationId": "b5f6c7dc1b028ec9ef96f158630aa5d2",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "name"
                                ],
                                "properties": {
                                    "name": {
                                        "type": "string",
                                        "example": "Menu du midi"
                                    },
                                    "description": {
                                        "type": "string",
                                        "example": "Disponible de 12h à 15h"
                                    },
                                    "is_active": {
                                        "type": "boolean",
                                        "example": true
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Menu created"
                    },
                    "422": {
                        "description": "Validation error - store_id required"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/v1/store/menus/{id}": {
            "get": {
                "tags": [
                    "Menus"
                ],
                "summary": "Show menu",
                "operationId": "0b892565c9e07ee22475aa0b22b44a1d",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Menu found"
                    },
                    "404": {
                        "description": "Menu not found"
                    }
                }
            },
            "put": {
                "tags": [
                    "Menus"
                ],
                "summary": "Update menu",
                "operationId": "295eb534bd76591476750029a2418566",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "properties": {
                                    "name": {
                                        "type": "string",
                                        "example": "Menu du soir"
                                    },
                                    "description": {
                                        "type": "string",
                                        "example": "Disponible de 18h à 22h"
                                    },
                                    "is_active": {
                                        "type": "boolean",
                                        "example": true
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Menu updated"
                    },
                    "403": {
                        "description": "Access denied - not owner"
                    },
                    "422": {
                        "description": "Validation error - store_id required"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "delete": {
                "tags": [
                    "Menus"
                ],
                "summary": "Delete menu",
                "operationId": "239db28cd5908e491fdc9337aa5cd2b0",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Menu deleted"
                    },
                    "404": {
                        "description": "Menu not found"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/v1/store/offers": {
            "get": {
                "tags": [
                    "Offers"
                ],
                "summary": "List active offers",
                "operationId": "8cdc0b43f1518975020d001407521e86",
                "responses": {
                    "200": {
                        "description": "Offers retrieved successfully"
                    }
                }
            },
            "post": {
                "tags": [
                    "Offers"
                ],
                "summary": "Create offer",
                "operationId": "2699d34c4d1c607e1d2a70412cf1a820",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "title",
                                    "discount"
                                ],
                                "properties": {
                                    "title": {
                                        "type": "string",
                                        "example": "Promo été"
                                    },
                                    "description": {
                                        "type": "string",
                                        "example": "-20% sur tout le menu"
                                    },
                                    "discount": {
                                        "type": "number",
                                        "format": "float",
                                        "example": 20
                                    },
                                    "starts_at": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "ends_at": {
                                        "type": "string",
                                        "format": "date-time"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Offer created"
                    },
                    "422": {
                        "description": "Validation error"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/v1/store/offers/{token}": {
            "get": {
                "tags": [
                    "Offers"
                ],
                "summary": "Show offer by token",
                "operationId": "ca33afa6b53cc7356a703e947472c3d7",
                "parameters": [
                    {
                        "name": "token",
                        "in": "path",
                        "description": "Unique offer token",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Offer found"
                    },
                    "404": {
                        "description": "Offer not found"
                    }
                }
            }
        },
        "/api/v1/store/offers/{id}": {
            "put": {
                "tags": [
                    "Offers"
                ],
                "summary": "Update offer",
                "operationId": "6b2038b83611f261961f34a215a51e40",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "properties": {
                                    "title": {
                                        "type": "string",
                                        "example": "Promo hiver"
                                    },
                                    "description": {
                                        "type": "string",
                                        "example": "-15% sur les boissons"
                                    },
                                    "discount": {
                                        "type": "number",
                                        "format": "float",
                                        "example": 15
                                    },
                                    "starts_at": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "ends_at": {
                                        "type": "string",
                                        "format": "date-time"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Offer updated"
                    },
                    "404": {
                        "description": "Offer not found"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "delete": {
                "tags": [
                    "Offers"
                ],
                "summary": "Delete offer",
                "operationId": "ce619cbb342e8bdcbbc0d5b5c8eb1684",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Offer deleted"
                    },
                    "404": {
                        "description": "Offer not found"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/v1/store/orders/{id}/accept": {
            "post": {
                "tags": [
                    "Order Acceptance"
                ],
                "summary": "Accept a pending order",
                "operationId": "cdd3e0c7ae568c02e7c151ff1b47ffe5",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "description": "Order ID",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Order accepted successfully"
                    },
                    "403": {
                        "description": "Unauthorized - not the store owner"
                    },
                    "422": {
                        "description": "Order cannot be accepted in its current status"
                    },
                    "404": {
                        "description": "Order not found"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/v1/store/orders/{id}/reject": {
            "post": {
                "tags": [
                    "Order Acceptance"
                ],
                "summary": "Reject a pending order",
                "operationId": "6d83cebe62f90a8919377b73aa6b6a43",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "description": "Order ID",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "rejection_reason"
                                ],
                                "properties": {
                                    "rejection_reason": {
                                        "type": "string",
                                        "example": "out_of_stock"
                                    },
                                    "rejection_note": {
                                        "type": "string",
                                        "example": "Produit indisponible aujourd'hui",
                                        "maxLength": 500
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Order rejected successfully"
                    },
                    "403": {
                        "description": "Unauthorized - not the store owner"
                    },
                    "422": {
                        "description": "Order cannot be rejected in its current status or validation error"
                    },
                    "404": {
                        "description": "Order not found"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        }
    },
    "components": {
        "securitySchemes": {
            "bearerAuth": {
                "type": "http",
                "scheme": "bearer",
                "bearerFormat": "JWT"
            }
        }
    },
    "tags": [
        {
            "name": "Store Categories",
            "description": "Store categories management"
        },
        {
            "name": "Menu Categories",
            "description": "Gestion des catégories de menus"
        },
        {
            "name": "Menus",
            "description": "Gestion des menus des stores"
        },
        {
            "name": "Offers",
            "description": "Gestion des offres promotionnelles"
        },
        {
            "name": "Order Acceptance",
            "description": "Acceptation et refus manuel des commandes par le store"
        },
        {
            "name": "Customer Auth",
            "description": "Customer Auth"
        }
    ]
}